Qt 个性化标题栏,自定义标题栏
来源:互联网 发布:新西兰博士含金量知乎 编辑:程序博客网 时间:2024/05/01 00:14
目前还没有达到自己满意的地步,魔方别人写的的,先提供参考,后面在加入新的东西
头文件
#ifndef TITLEBAR_H#define TITLEBAR_H#include <QWidget>class QLabel;class QPushButton;class TitleBar : public QWidget{ Q_OBJECTpublic: explicit TitleBar(QWidget *parent = 0); ~TitleBar();protected: /* * 双击标题栏进行界面最大化/还原 */ virtual void mouseDoubleClickEvent(QMouseEvent *event); /* * 进行鼠标界面的拖动 */ virtual void mousePressEvent(QMouseEvent *event); /* * 设置界面标题与图标 */ virtual bool eventFilter(QObject *watched, QEvent *event);private slots: /* * 进行最小化、最大化/还原。关闭操作 */ void onClicked();private: /* * 最大化/还原 */ void updateMaximize();private: QLabel* m_pIconLabel; QLabel* m_pTitleLabel; QPushButton* m_pMiniMizeButton; QPushButton* m_pMaximizeButton; QPushButton* m_pCloseButton;};#endif // TITLEBAR_H
cpp文件
#include "titlebar.h"#include <QLabel>#include <QPushButton>#include <QHBoxLayout>#include <QEvent>#include <QMouseEvent>#include <QApplication>#include <QSizePolicy>#include <QIcon>#ifdef Q_OS_WIN#pragma comment(lib,"user32.lib")#include <qt_windows.h>#endifTitleBar::TitleBar(QWidget *parent) : QWidget(parent){ /* * 设置标题栏高度 */ this->setFixedHeight(30); /* * 初始化标题栏Button及Lable */ m_pIconLabel = new QLabel(this); m_pTitleLabel = new QLabel(this); m_pMiniMizeButton = new QPushButton(this); m_pMaximizeButton = new QPushButton(this); m_pCloseButton = new QPushButton(this); m_pIconLabel->setFixedSize(20,20); m_pIconLabel->setScaledContents(true); m_pTitleLabel->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); m_pCloseButton->setFixedSize(27,22); m_pMaximizeButton->setFixedSize(27,22); m_pMiniMizeButton->setFixedSize(27,22); m_pTitleLabel->setObjectName("whiteLabel"); m_pMiniMizeButton->setObjectName("minimizeButton"); m_pMaximizeButton->setObjectName("maximizeButton"); m_pCloseButton->setObjectName("closeButton"); m_pMaximizeButton->setToolTip("Maximize"); m_pMiniMizeButton->setToolTip("Minimize"); m_pCloseButton->setToolTip("Close"); QHBoxLayout* pLayout = new QHBoxLayout(this); pLayout->addWidget(m_pIconLabel); pLayout->addSpacing(5); pLayout->addWidget(m_pTitleLabel); pLayout->addWidget(m_pMiniMizeButton); pLayout->addWidget(m_pMaximizeButton); pLayout->addWidget(m_pCloseButton); pLayout->setSpacing(0); this->setLayout(pLayout); connect(m_pMiniMizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked())); connect(m_pMaximizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked())); connect(m_pCloseButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));}TitleBar::~TitleBar(){}void TitleBar::mouseDoubleClickEvent(QMouseEvent *event){ Q_UNUSED(event); emit m_pMaximizeButton->click();}void TitleBar::mousePressEvent(QMouseEvent *event){#ifdef Q_OS_WIN if(ReleaseCapture()) { QWidget* pWindow = this->window(); if(pWindow->isTopLevel()) { SendMessage(HWND(pWindow->winId()),WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0); } } event->ignore();#else#endif}bool TitleBar::eventFilter(QObject *watched, QEvent *event){ switch (event->type()) { case QEvent::WindowTitleChange: { QWidget* pWidget = qobject_cast<QWidget*>(watched); if(pWidget) { m_pTitleLabel->setText(pWidget->windowTitle()); return true; } } case QEvent::WindowIconChange: { QWidget* pWidget = qobject_cast<QWidget*>(watched); if(pWidget) { QIcon icon = pWidget->windowIcon(); m_pIconLabel->setPixmap(icon.pixmap(m_pIconLabel->size())); return true; } } case QEvent::WindowStateChange: case QEvent::Resize: { updateMaximize(); return true; } } return QWidget::eventFilter(watched,event);}void TitleBar::onClicked(){ QPushButton* pButton = qobject_cast<QPushButton*>(sender()); QWidget* pWidget = this->window(); if(pWidget->isTopLevel()) { if(pButton == m_pMiniMizeButton) { pWidget->showMinimized(); } else if(pButton == m_pMaximizeButton) { pWidget->isMaximized()?pWidget->showNormal():pWidget->showMaximized(); } else if(pButton == m_pCloseButton) { pWidget->close(); } }}void TitleBar::updateMaximize(){ QWidget* pWidget = this->window(); if(pWidget->isTopLevel()) { bool bMaximize = pWidget->isMaximized(); if(bMaximize) { m_pMaximizeButton->setToolTip("Restore"); m_pMaximizeButton->setProperty("maximizePorperty","restore"); } else { m_pMaximizeButton->setToolTip("Maximize"); m_pMaximizeButton->setProperty("maximizePorperty","maximize"); } m_pMaximizeButton->setStyle(QApplication::style()); }}
使用
#include "widget.h"#include "ui_widget.h"#include "titlebar.h"#include <QPalette>#include <QVBoxLayout>Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); //remove the title bar TitleBar* pTitleBar = new TitleBar(this); this->installEventFilter(pTitleBar); this->resize(400,300); this->setWindowTitle("Thunder");// this->setWindowIcon(QIcon()); QPalette pal(palette()); pal.setColor(QPalette::Background,QColor(50,50,50)); setAutoFillBackground(true); setPalette(pal); QVBoxLayout *pLayout = new QVBoxLayout(); pLayout->addWidget(pTitleBar); pLayout->addStretch(); pLayout->setSpacing(0); pLayout->setContentsMargins(0,0,0,0); this->setLayout(pLayout);}Widget::~Widget(){ delete ui;}这里的效果还是有问题的,还在排错中
1 0
- Qt 个性化标题栏,自定义标题栏
- ...Qt实现--自定义标题栏
- 自定义 Qt 窗口标题栏
- QT 自定义标题栏
- qt 自定义标题栏
- Qt 自定义标题栏
- Qt:自定义标题栏(QMainWindow)
- qt创建自定义标题栏
- Qt 之 自定义窗口标题栏
- Qt自定义外观--自定义标题栏的窗口
- Qt自定义外观--自定义标题栏的窗口
- 自定义标题栏
- 自定义标题栏
- 自定义标题栏
- 自定义标题栏
- 自定义标题栏
- 自定义标题栏
- 自定义标题栏
- docker
- 进程间同步--互斥量和文件锁
- B样条差值算法图像放大的学习和实现
- 小米5之Root攻略
- Building Faster APIs with NodeJs and Redis
- Qt 个性化标题栏,自定义标题栏
- Servlert
- 关于人脉的逻辑,和个人处世的逻辑
- JSP
- WalkerSimulate
- JE22入门
- Android 内存泄漏总结(一)
- D1的其他数据输出
- Python中的Set