微网站备案,湖南网站建设的公司排名,七台河新闻直播,黄骅港船舶动态Qt开发 系列文章 - user-defined-titlebars#xff08;十#xff09; 目录
前言
一、方式一
1.效果演示
2.创建标题栏类
3.可视化UI设计
4.定义相关函数
5.使用标题栏类
二、方式二
1.效果演示
2.创建标题栏类
3.定义相关函数
1.初始化函数
2.功能函数
3.窗口关…Qt开发 系列文章 - user-defined-titlebars十 目录
前言
一、方式一
1.效果演示
2.创建标题栏类
3.可视化UI设计
4.定义相关函数
5.使用标题栏类
二、方式二
1.效果演示
2.创建标题栏类
3.定义相关函数
1.初始化函数
2.功能函数
3.窗口关联
4.使用标题栏类
三、方式三
1.实现方式
2.效果演示
总结 前言
Qt自带的窗口标题栏通常遵循操作系统的默认样式和布局以确保在不同平台上都能提供一致且符合用户期望的用户体验因此Qt自带的窗口标题栏无法自定义。但我们在Qt设计软件时经常需要改变窗口标题栏的样式以满足不同场合用户需求。本文紧接着上一篇博文Qt之修改窗口标题、图标以及自定义标题栏九-CSDN博客的基础上在介绍几种实现自定义标题栏的方法并提供简单示例。 一、方式一
上一篇博文Qt之修改窗口标题、图标以及自定义标题栏九实现该方式是通过直接手鲁编写标题栏UI代码下面提供的方式是在可视化界面UI上来设计标题栏简洁方便直观然后绑定/链接到主窗口界面上。
1.效果演示 2.创建标题栏类
跟上一个有区别的是在原有的项目上添加新的类文件选择带ui设计类的模版选择如下。 然后定义类和ui的名称为MyTitleBarMyTitleBar类的头文件代码如下示例
/** 只提供与上一篇不一样的代码地方 **/
QT_BEGIN_NAMESPACE
namespace Ui { class MyTitleBar; }
QT_END_NAMESPACEclass MyTitleBar : public QWidget
{
private slots:// 按钮触发的槽;void on_m_pButtonClose_clicked();void on_m_pButtonMax_clicked();void on_m_pButtonRestore_clicked();void on_m_pButtonMin_clicked();
private:Ui::MyTitleBar *ui;
};
3.可视化UI设计
上面我们定义标题栏类的头文件下面来在可视化界面UI上来设计标题栏双击打开.ui文件在图像化设计界面设计如下标题栏。 上面设计完后Qt会自动生成相应的UI代码和头文件相关类为Ui_MyTitleBar。
4.定义相关函数
设计好MyTitleBar的UI文件后下面来说明相关功能函数。
#include ui_mytitlebar.h
#include mytitlebar.hMyTitleBar::MyTitleBar(QWidget *parent): QWidget(parent), ui(new Ui::MyTitleBar)
{// UI初始化ui-setupUi(this);// 初始化控件initControl();// 初始化标题栏色彩setBackgroundColor(m_colorR, m_colorG, m_colorB, m_isTransparent);// 加载本地样式 .css文件//loadStyleSheet(MyTitle);// 初始化标题栏色彩setBackgroundColor(230,232,250,0);setStyleSheet(QToolButton#m_pButtonMenu,QPushButton#m_pButtonMin,QPushButton#m_pButtonMax,QPushButton#m_pButtonClose{\border-radius:3px;\color:#324C6C;\padding:3px;\margin:0px;\background:none;\border-style:none;\});setStyleSheet(QToolButton#m_pButtonMenu:hover,QPushButton#m_pButtonMin:hover,QPushButton#m_pButtonMax:hover{\color:#FFFFFF;\margin:1px 1px 2px 1px;\background-color:rgba(51,127,209,230);\});
}
MyTitleBar::~MyTitleBar()
{
}
void MyTitleBar::initControl()
{m_colorR0;m_colorG153;m_colorB153;m_isPressedfalse;m_buttonTypeMIN_MAX_BUTTON;m_windowBorderWidth0;m_isTransparentfalse;setFixedHeight(30);setWindowFlags(Qt::FramelessWindowHint);// 添加换肤菜单QStringList name;name 银色 蓝色 浅蓝色 深蓝色;foreach (QString str, name) {QAction *action new QAction(str, this);ui-m_pButtonMenu-addAction(action);connect(action, SIGNAL(triggered(bool)), this, SLOT(onButtonchangeStyle()));}
}
// 以下为按钮操作响应的槽
void MyTitleBar::onButtonchangeStyle()
{QAction *act (QAction *)sender();QString name act-text();//QString qssFile qss/blue.css;if (name 银色) {//qssFile qss/silvery.css;setBackgroundColor(230,232,250,0);}else if (name 蓝色){//qssFile qss/blue.css;setBackgroundColor(50,76,108,0);}else if (name 浅蓝色){//qssFile qss/lightblue.css;setBackgroundColor(56,100,135,0);}else if (name 深蓝色){//qssFile qss/darkblue.css;setBackgroundColor(122,175,227,0);}//loadStyleSheet(qssFile);//emit signalchangeStyle(qssFile);
}
void MyTitleBar::on_m_pButtonClose_clicked()
{emit signalButtonCloseClicked();
}
void MyTitleBar::on_m_pButtonMax_clicked()
{ui-m_pButtonMax-setVisible(false);ui-m_pButtonRestore-setVisible(true);emit signalButtonMaxClicked();
}
void MyTitleBar::on_m_pButtonRestore_clicked()
{ui-m_pButtonRestore-setVisible(false);ui-m_pButtonMax-setVisible(true);emit signalButtonRestoreClicked();
}
void MyTitleBar::on_m_pButtonMin_clicked()
{emit signalButtonMinClicked();
}
5.使用标题栏类
在用户的构造函数上面添加对标题栏类的使用跟上一篇博文一样。
二、方式二
方式一实现自定义标题栏时定义一个标题栏类在生成标题栏时会覆盖原有的MenuBar和ToolBar方式二改进后修改标题栏不覆盖效果如下。
1.效果演示 2.创建标题栏类
跟上一篇博文一样在原有的项目上添加C新的类文件选择如下。 然后定义标题栏类代码部分如下示例
#include QDialog
#include QMutexclass QLabel;
class QPushButton;
class QToolButton;
class QVBoxLayout;
class QHBoxLayout;
class QFrame;
class QSpacerItem;
class QLineEdit;
class QComboBox;
class QAbstractButton;
class QUIWidget : public QDialog#endif
{Q_OBJECTQ_ENUMS(Style)Q_PROPERTY(QString title READ getTitle WRITE setTitle)Q_PROPERTY(Qt::Alignment alignment READ getAlignment WRITE setAlignment)
public:explicit QUIWidget(QWidget *parent 0);~QUIWidget();
public Q_SLOTS://设置主窗体void setMainWidget(QWidget *mainWidget);//设置部件图标void setIcon(QUIWidget::Widget widget, QChar str, quint32 size 9);//设置部件图片void setPixmap(QUIWidget::Widget widget, const QString file, const QSize size QSize(16, 16));//设置部件是否可见void setVisible(QUIWidget::Widget widget, bool visible true);//设置只有关闭按钮void setOnlyCloseBtn();//设置标题栏高度void setTitleHeight(int height);//设置按钮统一宽度void setBtnWidth(int width);//设置标题及文本样式void setTitle(const QString title);void setAlignment(Qt::Alignment alignment);
};
3.定义相关函数
1.初始化函数
在标题栏类构造函数上初始化如下设置代码如下。
QUIWidget::QUIWidget(QWidget *parent) : QDialog(parent)
{//定义标题栏字体文本编码this-setTranslator(:/qm/qt_zh_CN.qm);this-setCode();this-initControl();this-initForm();//设置标题栏标题
#ifdef csdsetTitle(**软件);
#elsesetTitle(csd演示版);
#endif//设置标题文本居中setAlignment(Qt::AlignCenter);//设置窗体可拖动大小setSizeGripEnabled(true);//设置换肤下拉菜单可见setVisible(QUIWidget::BtnMenu, true);//设置标题栏高度setTitleHeight(30);//设置按钮宽度setBtnWidth(30);//设置软件左上角图标--没有图标时显示图形字体setPixmap(QUIWidget::Lab_Ico, ico/butterfly.ico, QSize(30,30));//默认样式风格bluesetStyle(:/qss/blue.css);QFont font;font.setPointSize(12);this-setFont(font);
}
void QUIWidget::initControl()
{this-setObjectName(QString::fromUtf8(QUIWidget));this-resize(900, 750);verticalLayout1 new QVBoxLayout(this);verticalLayout1-setSpacing(0);verticalLayout1-setContentsMargins(11, 11, 11, 11);verticalLayout1-setObjectName(QString::fromUtf8(verticalLayout1));verticalLayout1-setContentsMargins(1, 1, 1, 1);widgetMain new QWidget(this);widgetMain-setObjectName(QString::fromUtf8(widgetMain));widgetMain-setStyleSheet(QString::fromUtf8());verticalLayout2 new QVBoxLayout(widgetMain);verticalLayout2-setSpacing(0);verticalLayout2-setContentsMargins(11, 11, 11, 11);verticalLayout2-setObjectName(QString::fromUtf8(verticalLayout2));verticalLayout2-setContentsMargins(0, 0, 0, 0);widget_title new QWidget(widgetMain);widget_title-setObjectName(QString::fromUtf8(widget_title));QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);sizePolicy.setHorizontalStretch(0);sizePolicy.setVerticalStretch(0);sizePolicy.setHeightForWidth(widget_title-sizePolicy().hasHeightForWidth());widget_title-setSizePolicy(sizePolicy);widget_title-setMinimumSize(QSize(0, 30));horizontalLayout4 new QHBoxLayout(widget_title);horizontalLayout4-setSpacing(0);horizontalLayout4-setContentsMargins(11, 11, 11, 11);horizontalLayout4-setObjectName(QString::fromUtf8(horizontalLayout4));horizontalLayout4-setContentsMargins(0, 0, 0, 0);lab_Ico new QLabel(widget_title);lab_Ico-setObjectName(QString::fromUtf8(lab_Ico));QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Preferred);sizePolicy1.setHorizontalStretch(0);sizePolicy1.setVerticalStretch(0);sizePolicy1.setHeightForWidth(lab_Ico-sizePolicy().hasHeightForWidth());lab_Ico-setSizePolicy(sizePolicy1);lab_Ico-setMinimumSize(QSize(30, 0));lab_Ico-setAlignment(Qt::AlignCenter);horizontalLayout4-addWidget(lab_Ico);lab_Title new QLabel(widget_title);lab_Title-setObjectName(QString::fromUtf8(lab_Title));QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Preferred);sizePolicy2.setHorizontalStretch(0);sizePolicy2.setVerticalStretch(0);sizePolicy2.setHeightForWidth(lab_Title-sizePolicy().hasHeightForWidth());lab_Title-setSizePolicy(sizePolicy2);lab_Title-setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignVCenter);horizontalLayout4-addWidget(lab_Title);widget_menu new QWidget(widget_title);widget_menu-setObjectName(QString::fromUtf8(widget_menu));sizePolicy1.setHeightForWidth(widget_menu-sizePolicy().hasHeightForWidth());widget_menu-setSizePolicy(sizePolicy1);horizontalLayout new QHBoxLayout(widget_menu);horizontalLayout-setSpacing(0);horizontalLayout-setContentsMargins(11, 11, 11, 11);horizontalLayout-setObjectName(QString::fromUtf8(horizontalLayout));horizontalLayout-setContentsMargins(0, 0, 0, 0);btnMenu new QToolButton(widget_menu);btnMenu-setObjectName(QString::fromUtf8(btnMenu));QSizePolicy sizePolicy3(QSizePolicy::Fixed, QSizePolicy::Expanding);sizePolicy3.setHorizontalStretch(0);sizePolicy3.setVerticalStretch(0);sizePolicy3.setHeightForWidth(btnMenu-sizePolicy().hasHeightForWidth());btnMenu-setSizePolicy(sizePolicy3);btnMenu-setMinimumSize(QSize(30, 0));btnMenu-setMaximumSize(QSize(30, 16777215));btnMenu-setFocusPolicy(Qt::NoFocus);btnMenu-setPopupMode(QToolButton::InstantPopup);horizontalLayout-addWidget(btnMenu);btnMenu_Min new QPushButton(widget_menu);btnMenu_Min-setObjectName(QString::fromUtf8(btnMenu_Min));QSizePolicy sizePolicy4(QSizePolicy::Minimum, QSizePolicy::Expanding);sizePolicy4.setHorizontalStretch(0);sizePolicy4.setVerticalStretch(0);sizePolicy4.setHeightForWidth(btnMenu_Min-sizePolicy().hasHeightForWidth());btnMenu_Min-setSizePolicy(sizePolicy4);btnMenu_Min-setMinimumSize(QSize(30, 0));btnMenu_Min-setMaximumSize(QSize(30, 16777215));btnMenu_Min-setCursor(QCursor(Qt::ArrowCursor));btnMenu_Min-setFocusPolicy(Qt::NoFocus);horizontalLayout-addWidget(btnMenu_Min);btnMenu_Max new QPushButton(widget_menu);btnMenu_Max-setObjectName(QString::fromUtf8(btnMenu_Max));sizePolicy3.setHeightForWidth(btnMenu_Max-sizePolicy().hasHeightForWidth());btnMenu_Max-setSizePolicy(sizePolicy3);btnMenu_Max-setMinimumSize(QSize(30, 0));btnMenu_Max-setMaximumSize(QSize(30, 16777215));btnMenu_Max-setCursor(QCursor(Qt::ArrowCursor));btnMenu_Max-setFocusPolicy(Qt::NoFocus);horizontalLayout-addWidget(btnMenu_Max);btnMenu_Close new QPushButton(widget_menu);btnMenu_Close-setObjectName(QString::fromUtf8(btnMenu_Close));sizePolicy3.setHeightForWidth(btnMenu_Close-sizePolicy().hasHeightForWidth());btnMenu_Close-setSizePolicy(sizePolicy3);btnMenu_Close-setMinimumSize(QSize(30, 0));btnMenu_Close-setMaximumSize(QSize(30, 16777215));btnMenu_Close-setCursor(QCursor(Qt::ArrowCursor));btnMenu_Close-setFocusPolicy(Qt::NoFocus);horizontalLayout-addWidget(btnMenu_Close);horizontalLayout4-addWidget(widget_menu);verticalLayout2-addWidget(widget_title);widget new QWidget(widgetMain);widget-setObjectName(QString::fromUtf8(widget));verticalLayout3 new QVBoxLayout(widget);verticalLayout3-setSpacing(0);verticalLayout3-setContentsMargins(11, 11, 11, 11);verticalLayout3-setObjectName(QString::fromUtf8(verticalLayout3));verticalLayout3-setContentsMargins(0, 0, 0, 0);verticalLayout2-addWidget(widget);verticalLayout1-addWidget(widgetMain);connect(this-btnMenu_Min, SIGNAL(clicked(bool)), this, SLOT(on_btnMenu_Min_clicked()));connect(this-btnMenu_Max, SIGNAL(clicked(bool)), this, SLOT(on_btnMenu_Max_clicked()));connect(this-btnMenu_Close, SIGNAL(clicked(bool)), this, SLOT(on_btnMenu_Close_clicked()));
}void QUIWidget::initForm()
{//设置图形字体setIcon(QUIWidget::Lab_Ico, QChar(0xf099), 11); //设置左上角图标-图形字体setIcon(QUIWidget::BtnMenu, 0xf0d7);setIcon(QUIWidget::BtnMenu_Min, 0xf068);setIcon(QUIWidget::BtnMenu_Max, 0xf067);setIcon(QUIWidget::BtnMenu_Close, 0xf00d);//设置标题及对齐方式setTitle(QUI Demo);setAlignment(Qt::AlignLeft | Qt::AlignVCenter);setVisible(QUIWidget::BtnMenu, false);mainWidget 0;max false;location this-geometry();this-setProperty(form, true);this-setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);//第一个参数是设置无边框。第二个参数是允许任务栏按钮右键菜单第三个参数是允许最小化最大化与还原this-setWindowFlags(Qt::FramelessWindowHint);//任务栏单击图标后最小化后图标会消失无法解决因此不让最小化//绑定事件过滤器监听鼠标移动this-installEventFilter(this);this-widget_title-installEventFilter(this);//添加换肤菜单QStringList name;name 银色 蓝色 浅蓝色 深蓝色 灰色 浅灰色 深灰色 黑色 浅黑色 深黑色 PS黑色 黑色扁平 白色扁平 浅紫色 橙色;foreach (QString str, name) {QAction *action new QAction(str, this);this-btnMenu-addAction(action);connect(action, SIGNAL(triggered(bool)), this, SLOT(changeStyle()));}
}
2.功能函数
具体设置部件图标、设置部件图片、设置部件是否可见、设置标题栏高度、设置按钮统一宽度、设置标题及文本样式等等设置代码如下。
void QUIWidget::setIcon(QUIWidget::Widget widget, QChar str, quint32 size)
{if (widget QUIWidget::Lab_Ico) {IconHelper::Instance()-setIcon(this-lab_Ico, str, size);} else if (widget QUIWidget::BtnMenu) {IconHelper::Instance()-setIcon(this-btnMenu, str, size);} else if (widget QUIWidget::BtnMenu_Min) {IconHelper::Instance()-setIcon(this-btnMenu_Min, str, size);} else if (widget QUIWidget::BtnMenu_Max) {IconHelper::Instance()-setIcon(this-btnMenu_Max, str, size);} else if (widget QUIWidget::BtnMenu_Close) {IconHelper::Instance()-setIcon(this-btnMenu_Close, str, size);}
}void QUIWidget::setPixmap(QUIWidget::Widget widget, const QString file, const QSize size)
{QPixmap pix QPixmap(file);//按照宽高比自动缩放pix pix.scaled(size, Qt::KeepAspectRatio);if (widget QUIWidget::Lab_Ico) {this-lab_Ico-setPixmap(pix);} else if (widget QUIWidget::BtnMenu) {this-btnMenu-setIcon(QIcon(file));} else if (widget QUIWidget::BtnMenu_Min) {this-btnMenu_Min-setIcon(QIcon(file));} else if (widget QUIWidget::BtnMenu_Max) {this-btnMenu_Max-setIcon(QIcon(file));} else if (widget QUIWidget::BtnMenu_Close) {this-btnMenu_Close-setIcon(QIcon(file));}
}void QUIWidget::setVisible(QUIWidget::Widget widget, bool visible)
{if (widget QUIWidget::Lab_Ico) {this-lab_Ico-setVisible(visible);} else if (widget QUIWidget::BtnMenu) {this-btnMenu-setVisible(visible);} else if (widget QUIWidget::BtnMenu_Min) {this-btnMenu_Min-setVisible(visible);} else if (widget QUIWidget::BtnMenu_Max) {this-btnMenu_Max-setVisible(visible);} else if (widget QUIWidget::BtnMenu_Close) {this-btnMenu_Close-setVisible(visible);}
}void QUIWidget::setOnlyCloseBtn()
{this-btnMenu-setVisible(false);this-btnMenu_Min-setVisible(false);this-btnMenu_Max-setVisible(false);
}void QUIWidget::setTitleHeight(int height)
{this-widget_title-setFixedHeight(height);
}void QUIWidget::setBtnWidth(int width)
{this-lab_Ico-setFixedWidth(width);this-btnMenu-setFixedWidth(width);this-btnMenu_Min-setFixedWidth(width);this-btnMenu_Max-setFixedWidth(width);this-btnMenu_Close-setFixedWidth(width);
}void QUIWidget::setTitle(const QString title)
{if (this-title ! title) {this-title title;this-lab_Title-setText(title);this-setWindowTitle(this-lab_Title-text());}
}void QUIWidget::setAlignment(Qt::Alignment alignment)
{if (this-alignment ! alignment) {this-alignment alignment;this-lab_Title-setAlignment(alignment);}
}void QUIWidget::on_btnMenu_Min_clicked()
{this-showMinimized();
}void QUIWidget::on_btnMenu_Max_clicked()
{if (max) {this-setGeometry(location);} else {location this-geometry();this-setGeometry(qApp-desktop()-availableGeometry());}max !max;
}void QUIWidget::on_btnMenu_Close_clicked()
{close();
}
3.窗口关联
打开主函数文件在Main函数上将主窗口用户链接到标题栏窗口上关联起来代码如下。
int main(int argc, char *argv[])
{QApplication a(argc, argv);//定义用户窗口MainWindow *w new MainWindow;//定义标题栏QUIWidget qui;//将主窗体链接/关联到标题栏窗口上qui.setMainWidget(w);qui.show();return a.exec();
}
void QUIWidget::setMainWidget(QWidget *mainWidget)
{//一个QUI窗体对象只能设置一个主窗体if (this-mainWidget 0) {//将子窗体添加到布局this-widget-layout()-addWidget(mainWidget);//自动设置大小resize(mainWidget-width(), mainWidget-height() this-widget_title-height());this-mainWidget mainWidget;this-mainWidget-installEventFilter(this);}
}
4.使用标题栏类
因为在Main函数上已经将主窗体链接/关联到标题栏窗口上因此在用户层无需关注/设置标题栏相关参数。这里和方式一不一样的是方式是将标题栏类作为主窗口的私有变量使用而方式二只是将两个窗口界面关联起来而已。
至此方式二讲解完毕该种方式有个缺点是需要手鲁UI设计代码。更快捷的是通过可视化界面UI来设计标题栏然后绑定/链接到主窗口界面上跟方式一一样。
三、方式三
方式三的实现方式不同于上述两种需要创建具体标题栏类而这种方式三是不需要的只需要在原项目上的主窗口UI上绘制一个标题栏然后影藏主标题栏显示绘制的标题栏即可。具体实现示例见文末链接处下面介绍下实现思路。
1.实现方式
打开原有项目的可视化UI设计文件进行如下设计。 在重新绘制的标题栏上面有原项目保留的菜单栏在程序构造函数将其隐藏即可另将其关联到新建的菜单栏上避免再绘制具体代码如下。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);this-setWindowTitle(我的窗口);/*** 隐藏原有的工具栏和菜单栏 ***/ui-toolBar-hide();ui-menubar-hide();setBtnHeight(26);InitChart();/*** 注册事件过滤器 ***/ui-widget-installEventFilter(this);ui-tab-installEventFilter(this);ui-tab_2-installEventFilter(this);// 注册只点击标题栏移动事件过滤器ui-horizontalWidget-installEventFilter(this);/*** 创建右键菜单 ***/CreateMenu(ui-widget);CreateMenu(ui-tab);CreateMenu(ui-tab_2);// 添加换肤菜单QStringList name;name 浅蓝色 浅青色 浅灰色 浅灰色 浅红色 浅紫色 浅橙色;foreach (QString str, name) {QAction *action new QAction(str, this);ui-toolButton-addAction(action);connect(action, SIGNAL(triggered(bool)), this, SLOT(onButtonchangeStyle()));}// 关联/添加到新的菜单栏上menubar new QMenuBar(ui-horizontalWidget_2);menubar-setObjectName(QString::fromUtf8(menubar));menubar-setGeometry(QRect(0, 0, 785, 23));menubar-addAction(ui-menu-menuAction());menubar-addAction(ui-menu_2-menuAction());menubar-addAction(ui-menu_3-menuAction());
}
void MainWindow::setBtnHeight(int Height)
{ui-label-setFixedHeight(Height);ui-label_2-setFixedHeight(Height);ui-toolButton-setFixedHeight(Height);ui-min-setFixedHeight(Height);ui-max-setFixedHeight(Height);ui-close-setFixedHeight(Height);
}
// 以下为按钮操作响应的槽
void MainWindow::onButtonchangeStyle()
{QAction *act (QAction *)sender();QString name act-text();if (name 浅蓝色)setStyleSheet(background-color: rgb(193210240));else if (name 浅青色)setStyleSheet(background-color: rgb(173, 255, 196));else if (name 浅灰色)setStyleSheet(background-color: rgb(211, 211, 211));else if (name 浅灰色)setStyleSheet(background-color: rgb(192, 192, 192));else if (name 浅红色)setStyleSheet(background-color: rgb(255, 182, 193));else if (name 浅紫色)setStyleSheet(background-color: rgb(171, 145, 204));else if (name 浅橙色)setStyleSheet(background-color: rgb(254, 216, 177));
}
以上完成重新标题栏的绘制和菜单栏的关联但是窗口无法移动下面在通过鼠标使窗口移动实现如下。
void MainWindow::mousePressEvent(QMouseEvent *event)
{if(event-button() Qt::LeftButton){whereismouse event-pos();}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{if(event-buttons() Qt::LeftButton){//当窗口最大化或最小化时也不进行触发if(MainWindow::isMaximized() || MainWindow::isMinimized())return;else {//当在按钮之类需要鼠标操作的地方不进行触发(防误触)if (ui-close-underMouse()||ui-max-underMouse()||ui-min-underMouse()) {}else {MainWindow::move(MainWindow::mapToGlobal(event-pos()-whereismouse));//移动}}}event-accept();
}
以上代码实现功能是点击窗口任意地方整个窗口移动若只需要点击标题栏使整个窗口移动则需要将上述代码屏蔽添加如下代码实现。
protected://void mousePressEvent(QMouseEvent *event) override;//void mouseMoveEvent(QMouseEvent *event) override;bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{if(watched ui-widget) {if(event-type() QEvent::MouseButtonPress)menu_widget-exec(cursor().pos()); //菜单显示的位置跟随鼠标}/*** 点击标题栏移动 ***/else if (watched ui-horizontalWidget) {QMouseEvent *pMouseEvent (QMouseEvent*)event;if(pMouseEvent-button() Qt::LeftButton)whereismouse pMouseEvent-pos();if(pMouseEvent-buttons() Qt::LeftButton){//当窗口最大化或最小化时也不进行触发if(MainWindow::isMaximized() || MainWindow::isMinimized())return 0;else {//当在按钮之类需要鼠标操作的地方不进行触发(防误触)if (ui-close-underMouse()||ui-max-underMouse()||ui-min-underMouse()) {}else {MainWindow::move(MainWindow::mapToGlobal(pMouseEvent-pos()-whereismouse));//移动}}}event-accept();}return QObject::eventFilter(watched, event);
}
2.效果演示
编译运行完效果如下。 总结
方式一实现方式是在原项目上新建一个带UI的设计类在新建UI上完成标题栏的绘制然后将该类设置为原主窗口的私有变量 方式二实现方式是在原项目上新建一个不带UI的C类然后通过手鲁代码编写标题栏然后在Main函数上将主窗口和标题栏窗口链接/关联起来 方式三实现方式是在原项目上的主窗口UI上绘制一个标题栏然后影藏主标题栏显示绘制的标题栏
博文中相应的工程代码Qt-Case.zip 利用Qt开发软件进行编的例程为博文提供案例-CSDN文库。 文章转载自: http://www.morning.pwzzk.cn.gov.cn.pwzzk.cn http://www.morning.pnfwd.cn.gov.cn.pnfwd.cn http://www.morning.buyid.com.cn.gov.cn.buyid.com.cn http://www.morning.frxsl.cn.gov.cn.frxsl.cn http://www.morning.hhqjf.cn.gov.cn.hhqjf.cn http://www.morning.mbaiwan.com.gov.cn.mbaiwan.com http://www.morning.qftzk.cn.gov.cn.qftzk.cn http://www.morning.bqnhh.cn.gov.cn.bqnhh.cn http://www.morning.mjkqj.cn.gov.cn.mjkqj.cn http://www.morning.rqqmd.cn.gov.cn.rqqmd.cn http://www.morning.cfcdr.cn.gov.cn.cfcdr.cn http://www.morning.ghyfm.cn.gov.cn.ghyfm.cn http://www.morning.jfqqs.cn.gov.cn.jfqqs.cn http://www.morning.msgcj.cn.gov.cn.msgcj.cn http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn http://www.morning.mbnhr.cn.gov.cn.mbnhr.cn http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn http://www.morning.mnccq.cn.gov.cn.mnccq.cn http://www.morning.clzly.cn.gov.cn.clzly.cn http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.zrpys.cn.gov.cn.zrpys.cn http://www.morning.bsjpd.cn.gov.cn.bsjpd.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.qlhkx.cn.gov.cn.qlhkx.cn http://www.morning.mztyh.cn.gov.cn.mztyh.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.mdmc.cn.gov.cn.mdmc.cn http://www.morning.zlhbg.cn.gov.cn.zlhbg.cn http://www.morning.ttdxn.cn.gov.cn.ttdxn.cn http://www.morning.krxzl.cn.gov.cn.krxzl.cn http://www.morning.webife.com.gov.cn.webife.com http://www.morning.spxk.cn.gov.cn.spxk.cn http://www.morning.kndst.cn.gov.cn.kndst.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.gklxm.cn.gov.cn.gklxm.cn http://www.morning.splkk.cn.gov.cn.splkk.cn http://www.morning.mzydm.cn.gov.cn.mzydm.cn http://www.morning.ntwxt.cn.gov.cn.ntwxt.cn http://www.morning.qjrjs.cn.gov.cn.qjrjs.cn http://www.morning.jcrlx.cn.gov.cn.jcrlx.cn http://www.morning.gbgdm.cn.gov.cn.gbgdm.cn http://www.morning.thrtt.cn.gov.cn.thrtt.cn http://www.morning.caswellintl.com.gov.cn.caswellintl.com http://www.morning.hpmzs.cn.gov.cn.hpmzs.cn http://www.morning.htbsk.cn.gov.cn.htbsk.cn http://www.morning.ksqyj.cn.gov.cn.ksqyj.cn http://www.morning.pbmkh.cn.gov.cn.pbmkh.cn http://www.morning.ftmzy.cn.gov.cn.ftmzy.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.ypxyl.cn.gov.cn.ypxyl.cn http://www.morning.wrwcf.cn.gov.cn.wrwcf.cn http://www.morning.pcgrq.cn.gov.cn.pcgrq.cn http://www.morning.nkiqixr.cn.gov.cn.nkiqixr.cn http://www.morning.gkdhf.cn.gov.cn.gkdhf.cn http://www.morning.spsqr.cn.gov.cn.spsqr.cn http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.nshhf.cn.gov.cn.nshhf.cn http://www.morning.dansj.com.gov.cn.dansj.com http://www.morning.qwbht.cn.gov.cn.qwbht.cn http://www.morning.xwlhc.cn.gov.cn.xwlhc.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.frqtc.cn.gov.cn.frqtc.cn http://www.morning.rnmdp.cn.gov.cn.rnmdp.cn http://www.morning.zcxjg.cn.gov.cn.zcxjg.cn http://www.morning.hxwhyjh.com.gov.cn.hxwhyjh.com http://www.morning.bsqbg.cn.gov.cn.bsqbg.cn http://www.morning.hnkkm.cn.gov.cn.hnkkm.cn http://www.morning.bqwrn.cn.gov.cn.bqwrn.cn http://www.morning.psxxp.cn.gov.cn.psxxp.cn http://www.morning.tnthd.cn.gov.cn.tnthd.cn http://www.morning.mzbyl.cn.gov.cn.mzbyl.cn http://www.morning.gtcym.cn.gov.cn.gtcym.cn http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn http://www.morning.wypyl.cn.gov.cn.wypyl.cn http://www.morning.zzaxr.cn.gov.cn.zzaxr.cn http://www.morning.tjwlp.cn.gov.cn.tjwlp.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.ndpzm.cn.gov.cn.ndpzm.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn