qt自定义窗口的标题栏
- 格式:docx
- 大小:78.05 KB
- 文档页数:5
QT新建⼀个窗⼝控制程序,以实现添加按钮点击弹出信息提⽰框为例 最近在学习QT编程,为了后⾯把X86平台的项⽬移植在Linux平台上,这⾥简单记录⼀下,第⼀步的学习过程,建⽴新⼯程。
1.新建项⽬ “Application”,中间的列表框中列出了可以创建的应⽤程序的模板,各类应⽤程序如下:Qt Widgets Application,⽀持桌⾯平台的有图形⽤户界⾯(Graphic User Interface,GUI)界⾯的应⽤程序。
GUI 的设计完全基于 C++ 语⾔,采⽤ Qt 提供的⼀套 C++ 类库。
Qt Console Application,控制台应⽤程序,⽆ GUI 界⾯,⼀般⽤于学习 C/C++ 语⾔,只需要简单的输⼊输出操作时可创建此类项⽬。
Qt Quick Application,创建可部署的 Qt Quick 2 应⽤程序。
Qt Quick 是 Qt ⽀持的⼀套 GUI 开发架构,其界⾯设计采⽤ QML 语⾔,程序架构采⽤ C++ 语⾔。
利⽤ Qt Quick 可以设计⾮常炫的⽤户界⾯,⼀般⽤于移动设备或嵌⼊式设备上⽆边框的应⽤程序的设计。
Qt Quick Controls 2 Application,创建基于 Qt Quick Controls 2 组件的可部署的 Qt Quick 2 应⽤程序。
Qt Quick Controls 2 组件只有 Qt 5.7 及以后版本才有。
Qt Canvas 3D Application,创建 Qt Canvas 3D QML 项⽬,也是基于 QML 语⾔的界⾯设计,⽀持 3D 画布。
这⾥选择 Qt Widgets Application 。
⼀路 Next 下去 ⼀路 Next 下去,到 Kits 这⾥注意把编译⼯具都勾上,后续编译的时候,想编译不同版本都可以。
2.编辑项⽬ 项⽬新建完成就可以得到⼀个基础项⽬⼯程,可以编辑了。
在项⽬名称节点下⾯,分组管理着项⽬内的各种源⽂件,⼏个⽂件及分组分别为以下⼏项:Demo.pro 是项⽬管理⽂件,包括⼀些对项⽬的设置项。
Qt基本控件-QWidget详解原⽂转载于:QWidget 类的构造函数如下:QWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);其中参数 parent 指向⽗窗⼝,如果这个参数为 0,则窗⼝就成为⼀个顶级窗⼝参数 f 是构造窗⼝的标志,主要⽤于控制窗⼝的类型和外观等,有以下常⽤值。
1)Qt::FramelessWindowHint:没有边框的窗⼝。
2)Qt::WindowStaysOnTopHint:总是最上⾯的窗⼝。
3)Qt::CustomizeWindowHint:⾃定义窗⼝标题栏,以下标志必须与这个标志⼀起使⽤才有效,否则窗⼝将有默认的标题栏。
4)Qt::WindowTitleHint:显⽰窗⼝标题栏。
5)Qt::WindowSystemMenuHint:显⽰系统菜单。
6)Qt::WindowMinimizeButtonHint:显⽰最⼩化按钮。
7)Qt::WindowMaximizeButtonHint:显⽰最⼤化按钮。
8)Qt::WindowMinMaxbuttonHint:显⽰最⼩化按钮和最⼤化按钮。
9)Qt::WindowCloseButtonHint:显⽰关闭按钮。
独⽴窗⼝窗⼝构造的时候如果有 Qt::Window 标志,那么它就是⼀个独⽴窗⼝,否则就是⼀个依附于其他独⽴窗⼝的窗⼝部件。
顶级窗⼝⼀定是独⽴窗⼝,但独⽴窗⼝不⼀定是顶级的,它可以有⽗窗⼝,当⽗窗⼝被析构时它也会随之被析构。
独⽴窗⼝⼀般有⾃⼰的外边框和标题栏,可以有移动、改变⼤⼩等操作。
⼀个窗⼝是否为独⽴窗⼝可⽤下⾯的成员函数来判断:bool isWindow() const; // 判断是否为独⽴窗⼝下⾯这个函数可以得到窗⼝部件所在的独⽴窗⼝。
QWidget *window() const; // 所得所在的独⽴窗⼝当然,如果窗⼝本⾝就是独⽴窗⼝,那么得到的就是⾃⼰。
PyQt5-菜单栏⼯具栏状态栏的使⽤(QMenuBar、QToolBar、QStatusBar)⼀、QMenuBar窗体标题下⽅QMenuBar作为窗体菜单栏;QMenu对象提供了⼀个可以添加菜单栏的控件,也可以⽤于创建上下⽂菜单和弹出菜单选项;每个QMenu对象都可以包含⼀个或者多个QAction对象或者级联的QMenu对象;createPopupMenu()⽅法⽤于弹出⼀个菜单;menuBar()⽅法⽤于返回主窗⼝的QMenuBar对象;addMenu()⽅法可以将菜单添加到菜单栏;addAction() ⽅法可以在菜单中进⾏添加某些操作;常⽤⽅法:例如:1#QMenuBar/QMenu/QAction的使⽤(菜单栏)2from PyQt5.QtWidgets import QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout, QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel3from PyQt5.QtCore import QDir4from PyQt5.QtGui import QIcon,QPixmap,QFont5from PyQt5.QtCore import QDate67import sys89class WindowClass(QMainWindow):1011def__init__(self,parent=None):1213 super(WindowClass, self).__init__(parent)14 yout=QHBoxLayout()15 self.menubar=self.menuBar()#获取窗体的菜单栏1617 self.file=self.menubar.addMenu("系统菜单")18 self.file.addAction("New File")1920 self.save=QAction("Save",self)21 self.save.setShortcut("Ctrl+S")#设置快捷键22 self.file.addAction(self.save)2324 self.edit=self.file.addMenu("Edit")25 self.edit.addAction("copy")#Edit下这是copy⼦项26 self.edit.addAction("paste")#Edit下设置paste⼦项2728 self.quit=QAction("Quit",self)#注意如果改为:self.file.addMenu("Quit") 则表⽰该菜单下必须柚⼦菜单项;会有>箭头29 self.file.addAction(self.quit)30 self.file.triggered[QAction].connect(self.processtrigger)31 self.setLayout(yout)32 self.setWindowTitle("Menu Demo")3334def processtrigger(self,qaction):35print(qaction.text()+" is triggered!")3637if__name__=="__main__":38 app=QApplication(sys.argv)39 win=WindowClass()40 win.show()41 sys.exit(app.exec_())⼆、QToolBar⼯具栏该控件是由⽂本按钮、图标或者其他⼩控件按钮组成的可移动⾯板,通常位于菜单栏下⽅,作为⼯具栏使⽤;每次单击⼯具栏中的按钮,此时都会触发actionTriggered信号。
Qt笔记之使⽤设计器⾃定义窗⼝标题栏1.在窗⼝显⽰之前,设置WindowFlags为FramelessWindowHint,以产⽣⼀个没有边界的窗⼝例如Widget::Widget(QWidget *parent) :QWidget(parent, Qt::FramelessWindowHint), //在此设置WindowFlagsui(new Ui::Widget){ui->setupUi(this);//setWindowFlags(Qt::FramelessWindowHint); 或在构造函数体中设置}2.在设计器中,拖⼀个Widget到窗⼝上。
为⽅便描述,我命名此Widget为titleBarWidget将titleBarWidget的minimumSize->height改为30,以固定标题栏⾼度更改titleBarWidget的样式表为background-color: #12B7F5;再拖⼀个Vertical Spacer到窗⼝上,并设置窗⼝为竖直布局为去除标题栏边距,将layoutLeftMargin、layoutTopMargin和layoutRightMargin都设置为0效果如图3.为了能拖动标题栏移动窗⼝,我们定义⼀个类,如下TitleBarWidget.h#ifndef TITLEBARWIDGET_H#define TITLEBARWIDGET_H#include <QWidget>class TitleBarWidget : public QWidget{Q_OBJECTpublic:explicit TitleBarWidget(QWidget *parent = nullptr);protected:virtual void mousePressEvent(QMouseEvent *event);virtual void mouseMoveEvent(QMouseEvent *event);private:int differenceX, differenceY;};#endif// TITLEBARWIDGET_HTitleBarWidget.cpp#include "TitleBarWidget.h"#include <QMouseEvent>TitleBarWidget::TitleBarWidget(QWidget *parent) : QWidget(parent) { }void TitleBarWidget::mousePressEvent(QMouseEvent *event){QWidget *parentWidget = static_cast<QWidget *>(parent());differenceX = event->globalX() - parentWidget->x();differenceY = event->globalY() - parentWidget->y();}void TitleBarWidget::mouseMoveEvent(QMouseEvent *event){int x = event->globalX() - differenceX;int y = event->globalY() - differenceY;QWidget *parentWidget = static_cast<QWidget *>(parent());parentWidget->move(x, y);}将titleBarWidget提升为TitleBarWidget,就能实现拖动标题栏移动窗⼝了4.然⽽问题来了,titleBarWidget的样式表失效了为解决这个问题,需要重写QWidget中的paintEvent,代码如下void TitleBarWidget::paintEvent(QPaintEvent *event){Q_UNUSED(event)QStyleOption option;option.init(this);QStylePainter painter(this);painter.drawPrimitive(QStyle::PE_Widget, option);}。
在一个应用程序设计中,为了实现一些特定的功能,必领设计自定义对话框。
自定义对话框的设计一般从 QDialog 继承,并且可以采用UI设计器可视化地设计对话框。
对话框的调用一般包括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。
本节将通过实例 samp6_2 来详细介绍这些原理。
图 1 是实例 samp6_2 的主窗口,及其设置表格行列数的对话框。
图 1 实例 samp6_2 主窗口及其设置表格行列数的对话框主窗口采用 QTableView 和 QStandardltemModel、QltemSelectionModel 构成一个通用的数据表格编辑器,设计了 3 个对话框,分别具有不同的功能,并且展示对话框不同调用方式的特点:•设置表格行列数对话框 QWDialogSize该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。
这种对话框创建和调用方式适用于比较简单,不需要从主窗口传递大量数据做初始化的对话框,调用后删除对话框对象可以节约内存。
•设置表头标题对话框 QWDialogHeaders图 2 是设置表格表头标题的对话框,该对话框在父窗口(本例中就是主窗口)存续期间只创建一次,创建时传递表格表头字符串列表给对话框,在对话框里编辑表头标题后,主窗口获取编辑之后的表头标题。
图 2 设置表格表头标题对话框注意,对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时只是打开己创建的对话框对象。
这种创建和调用方式适用于比较复杂的对话框,需要从父窗口传递大量数据做对话框初始化。
下次调用时不需要重复初始化,能提高对话框调用速度,但是会一直占用内存,直到父窗口删除时,对话框才从内存中删除。
•单元格定位与文字设置对话框QWDialogLocate图 3 是单元格定位和文字设置对话框,该对话框以非模态方式调用,显示对话框时还可以对主窗口进行操作,对话框只是浮动在窗口上方。
【原创】Qt自定义窗口部件QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)改进法1、改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。
把这两个文件拷贝到想要的项目中。
HexspinBox.hHexspinBox.cpp2、在需要开发的项目中的窗口中,1、用Qt Designer创建一个新的窗体main.ui,把控件箱里的QSpinBox添加到窗体中。
2、右击微调框,选择“Promote to ”上下文菜单。
3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”好了。
在ui生成的包含有QSpinBox的控件文件中,ui的源代码里面多了一段<customwidgets><customwidget><class>HSpinBox</class><extends>QSpinBox</extends><header>hspinbox.h</header></customwidget>包含文件变为"hexspinbox.h"。
在Qt Designer中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。
可以在VS2008中编译一下main.ui文件,从ui_main.h源代码中可以知道,引入的控件是:升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。
这些问题可以用插件法解决。
插件法1.VS中创建Qt4 Design Plugin 工程,名称叫custom自动建立如下几个文件:自定义控件:custom.h,custom.cpp插件:customplugin.h,customplugin.cpp源代码如下:custom.hcustom.cppcustomplugin.hcustomplugin.cpp在其cpp的最后必须添加下面的宏:.........10........20........30........40........50........60........70........80........90........100. (1)10.......120.......130.......140. (150)2. 新建后,直接编译,会产生如下错误1>LINK : fatal error LNK1181: cannot open input file 'QtDesignerd.lib'这是因为此工程默认引用的是QtDesignerd.lib库,更改其为版本对应的库即可消除故障(VS2008是在项目的属性中Linker/input/Additional Dependencies中修改,我这里Debug配置使用的是QtDesignerd4.lib,Release 版本使用QtDesigner4.lib)。
qstyleoptiontitlebar 用法-概述说明以及解释1.引言1.1 概述qstyleoptiontitlebar 是一个用于界面设计的重要选项类,在Qt中起着至关重要的作用。
它是用来描述和定义标题栏的外观和行为的选项类,能够帮助设计师和开发人员定制和美化标题栏,以实现更好的用户体验。
标题栏是界面中的一个重要组成部分,通常包含窗口的标题、最小化、最大化和关闭按钮等元素。
通过使用qstyleoptiontitlebar,设计师和开发人员可以控制标题栏的样式和行为,使得应用程序的界面更加吸引人和易于操作。
在本文中,我们将深入探讨qstyleoptiontitlebar 的定义、作用、属性和用法,以及它在界面设计中的应用。
我们将对qstyleoptiontitlebar 的重要性进行总结,并探讨它在未来的发展前景。
最后,我们将提出对qstyleoptiontitlebar 使用的一些建议,希望能够帮助读者更好地理解和应用这个重要的选项类。
1.2 文章结构本文将分为三个主要部分,每个部分将详细探讨关于qstyleoptiontitlebar的不同方面。
第一部分是引言部分,我们将简要介绍qstyleoptiontitlebar的概述,文章结构和目的。
第二部分是正文部分,我们将详细探讨qstyleoptiontitlebar的定义和作用,属性和用法,以及在界面设计中的应用。
第三部分是结论部分,我们将总结qstyleoptiontitlebar的重要性,探讨其发展前景,并提出对其使用的建议。
通过这三个部分的阐述,读者将能够全面了解qstyleoptiontitlebar 的相关内容,并对其在界面设计中的作用有更深入的理解。
1.3 目的在本文中,我们的主要目的是对qstyleoptiontitlebar进行深入探讨,包括其定义、作用、属性和用法,以及在界面设计中的应用。
通过对qstyleoptiontitlebar的详细分析,我们旨在帮助读者更好地理解和运用这一工具,提高界面设计的效率和质量。
一、Qt概述1、关于QtQt是Trolltech公司的一个产品。
Qt是一个多平台的C++图形用户界面应用程序框架。
它提供给应用程序开发者建立图形用户界面应用程序所需的所有功能。
Qt是完全面向对象的,它很容易扩展,并且允许真正的组件编程。
自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。
Qt也是流行的Linux桌面环境KDE 的基础。
(KDE是所有主要的Linux发行版的一个标准组件)Qt支持下述平台:MS/Windows - 95、98、NT 4.0、ME、和2000Unix/X11 - Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它很多X11平台Macintosh - Mac OS XEmbedded - 有帧缓冲(frame buffer)支持的Linux平台。
2、Qt版本信息Qt被按不同的版本发行:Qt企业版和Qt专业版:提供给商业软件开发。
它们提供传统商业软件发行版并且提供免费升级和技术支持服务。
企业版比专业版多一些扩展模块。
Qt自由版:是Qt仅仅为了开发自由和开放源码软件提供的Unix/X11版本。
在Q公共许可证和GNU通用公共许可证下,它是免费的。
Qt/嵌入式自由版:是Qt为了开发自由软件提供的嵌入式版本。
在GNU通用公共许可证下,它是免费的。
下表是关于Qt在Windows环境下各个版本的区别。
(Qt为Windows只提供了专业版和企业版,不过自由版本的Qt仍然可以在Windows环境下使用)组成模块自由版专业版企业版Qt的基本模块(工具、核心、窗口部件、对话框)X X X与平台无关的Qt图形用户界面工具包和应用类Qt设计器X X X可视化的Qt图形用户界面的生成器图标视图模块X X几套图形用户交互操作的可视化效果。
工作区模块X X多文档界面(MDI)支持OpenGL 三维图形模块X在Qt中集成了OpenGL网络模块X一些套接字,TCP,FTP和异步DNS查询并与平台无关的类画布模块X为可视化效果,图表和其它而优化的二维图形领域表格模块X灵活的,可编辑的表格/电子表格XML模块X通过SAX接口和DOM Level 1的XML解析器SQL模块XSQL数据库访问类3、Qt的组成Qt提供了一组范围相当广泛的C++类库,并包含了几种命令行和图形界面的工具,有效地使用这些工具可以加速开发过程。
QT无边框窗体最大化遮挡windows任务栏的问题最近写的一个基于QT的程序的UI,要求整个窗体的风格浑然一体。
包括窗体的边框什么的。
这个其实定义了QSS啥的就没什么复杂的了,纯粹体力活了。
但是如果想整体制定一个窗体的话就需要让窗体的属性是无边框(frameless)的。
只有这样才能彻底的脱离windows的窗体管理器。
才能使用自己的标题栏(好像大家现在都流行自定义标题栏哈)。
但是问题来了。
frameless的窗体在最大化后会将windows的任务栏给遮挡住,这个是我们不想要的。
毕竟咱这个不是游戏,还是得留着任务栏的。
后来琢磨了半天也没想到啥好方法,后来看到Nokia 的Ovi套件的窗体,顿时发现就是我想要的style啊。
没有边框,但是自定义的标题栏。
最大化还不遮挡taskbar。
本着别人能做出来俺也能做出来的想法。
继续琢磨。
先用spy++看了下他的窗体flags,看看是不是有啥猫腻。
发现木有,人家就是一个frameless的wiget。
成了,这下踏实了自己琢磨吧。
之后想到了下面的这个方法最直接的想法肯定是用win32 api去查找taskbar的位置,然后设置自己窗体的正确位置。
这个就带来一个最郁闷的问题,这玩意没法跨平台了。
几经翻阅qt的手册。
发现QT确实还是挺伟大的。
有这么个函数const QRect QDesktopWidget::availableGeometry( int screen = -1 ) constReturns the available geometry of the screen with index screen. What is available will be subrect of screenGeometry() based on what the platform decides is available (for example excludes the dock and menu bar on Mac OS X, or the task bar on Windows). The default screen is used if screen is -1.QApplication::desktop()->availableGeometry();大概意思就是能得到目前screen上能够使用的最大尺寸(当然已经抛去了taskbar了)。
因为标题栏属于窗口管理器控制,也就受限于操作系统,所以直接利用Qt来修改是不可行的! 通常情况下利用Qt我们
可以自定义标题栏,这里提供一个简单的例子!
例子比较简,大致思路是正常创建窗口后,屏蔽标题栏,通过布局将一个QLabel和三个按钮构成一个“标题栏”
放置在顶端(视个人喜好,位置可以任意放置),重新实现必要的事件。
下面分步骤进行:
1. 创建窗口,屏蔽标题栏
例子中是创建了一个MainWindow窗口,构造过程中传入Qt::FramelessWindowHint 参数.
customTitleBar::customTitleBar(QWidget
*parent, Qt::WFlags flags) : QMainWindow(parent, Qt::FramelessWindowHint)
{
ui.setupUi(this);
ui.menuBar->hide(); ui.statusBar->hide();
......
}
2. 将自定义的“标题栏”放入窗口中
这里我们直接用QDeisgner进行设计,设计完成后利用布局将其置于顶端即可.
3. 事件处理在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动,
所以只重写鼠标事件: 单击、释放、双击和移动。
view plaincopy to clipboardprint?
1./*
2. QRect rect = ui.titleFrame->frameRect();
3. if(rect.contains(event->pos()));
4.这两句就是用于判断鼠标位置是否落在“标题栏”内。
5.*/
6.void Qt_Test::mousePressEvent(QMouseEvent *event)
7.{
8. if(event->button() == Qt::LeftButton)
9. {
10. dragPosition = event->globalPos() - frameGeometry().topLeft();
11.
12. QRect rect = ui.titleFrame->frameRect();
13. if(rect.contains(event->pos()))
14. {
15. m_bMoveable = true;
16. }
17. event->accept();
18. }
19.}
20.
21.void Qt_Test::mouseMoveEvent(QMouseEvent *event)
22.{
23. if(event->buttons() & Qt::LeftButton && !m_bMaximized && m_bMoveable)
24. {
25. move(event->globalPos() - dragPosition);
26. event->accept();
27. }
28.}
29.
30.void Qt_Test::mouseReleaseEvent(QMouseEvent* event)
31.{
32. if(m_bMoveable)
33. {
34. m_bMoveable = false;
35. }
36.}
37.
38.// 鼠标双击事件直接调用了还原按钮的事件
39.void Qt_Test::mouseDoubleClickEvent(QMouseEvent* event)
40.{
41. QRect rect = ui.titleFrame->frameRect();
42. if(rect.contains(event->pos()))
43. {
44. on_restoresize_clicked();
45. }
46.}
47./*
48.此例子是在Windows下编写,所以直接调用了Win32 API;
49.且只是假设任务栏在底端 :)
50.*/
51.void Qt_Test::on_restoresize_clicked()
52.{
53. if(m_bMaximized)
54. {
55. setGeometry(m_preRect);
56. m_bMaximized = false;
57. }
58. else
59. {
60. m_preRect = geometry();
61. WINDOWINFO wf;
62. ::GetWindowInfo(FindWindow(L"Shell_TrayWnd", NULL), &wf);
63. RECT trayRect = wf.rcWindow;
64. setGeometry(0, 0, trayRect.right+1, trayRect.top+1);
65. m_bMaximized = true;
66. }
67.}。