qt自定义窗口的标题栏
QT新建一个窗口控制程序,以实现添加按钮点击弹出信息提示框为例
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详解
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)
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笔记之使用设计器自定义窗口标题栏
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);}。
Qt基础教程之自定义对话框及调用方法
在一个应用程序设计中,为了实现一些特定的功能,必领设计自定义对话框。
自定义对话框的设计一般从 QDialog 继承,并且可以采用UI设计器可视化地设计对话框。
对话框的调用一般包括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。
本节将通过实例 samp6_2 来详细介绍这些原理。
图 1 是实例 samp6_2 的主窗口,及其设置表格行列数的对话框。
图 1 实例 samp6_2 主窗口及其设置表格行列数的对话框主窗口采用 QTableView 和 QStandardltemModel、QltemSelectionModel 构成一个通用的数据表格编辑器,设计了 3 个对话框,分别具有不同的功能,并且展示对话框不同调用方式的特点:•设置表格行列数对话框 QWDialogSize该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。
这种对话框创建和调用方式适用于比较简单,不需要从主窗口传递大量数据做初始化的对话框,调用后删除对话框对象可以节约内存。
•设置表头标题对话框 QWDialogHeaders图 2 是设置表格表头标题的对话框,该对话框在父窗口(本例中就是主窗口)存续期间只创建一次,创建时传递表格表头字符串列表给对话框,在对话框里编辑表头标题后,主窗口获取编辑之后的表头标题。
图 2 设置表格表头标题对话框注意,对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时只是打开己创建的对话框对象。
这种创建和调用方式适用于比较复杂的对话框,需要从父窗口传递大量数据做对话框初始化。
下次调用时不需要重复初始化,能提高对话框调用速度,但是会一直占用内存,直到父窗口删除时,对话框才从内存中删除。
•单元格定位与文字设置对话框QWDialogLocate图 3 是单元格定位和文字设置对话框,该对话框以非模态方式调用,显示对话框时还可以对主窗口进行操作,对话框只是浮动在窗口上方。
Qt自定义窗口部件
【原创】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 用法-概述说明以及解释
qstyleoptiontitlebar 用法-概述说明以及解释1.引言1.1 概述qstyleoptiontitlebar 是一个用于界面设计的重要选项类,在Qt中起着至关重要的作用。
它是用来描述和定义标题栏的外观和行为的选项类,能够帮助设计师和开发人员定制和美化标题栏,以实现更好的用户体验。
标题栏是界面中的一个重要组成部分,通常包含窗口的标题、最小化、最大化和关闭按钮等元素。
通过使用qstyleoptiontitlebar,设计师和开发人员可以控制标题栏的样式和行为,使得应用程序的界面更加吸引人和易于操作。
在本文中,我们将深入探讨qstyleoptiontitlebar 的定义、作用、属性和用法,以及它在界面设计中的应用。
我们将对qstyleoptiontitlebar 的重要性进行总结,并探讨它在未来的发展前景。
最后,我们将提出对qstyleoptiontitlebar 使用的一些建议,希望能够帮助读者更好地理解和应用这个重要的选项类。
1.2 文章结构本文将分为三个主要部分,每个部分将详细探讨关于qstyleoptiontitlebar的不同方面。
第一部分是引言部分,我们将简要介绍qstyleoptiontitlebar的概述,文章结构和目的。
第二部分是正文部分,我们将详细探讨qstyleoptiontitlebar的定义和作用,属性和用法,以及在界面设计中的应用。
第三部分是结论部分,我们将总结qstyleoptiontitlebar的重要性,探讨其发展前景,并提出对其使用的建议。
通过这三个部分的阐述,读者将能够全面了解qstyleoptiontitlebar 的相关内容,并对其在界面设计中的作用有更深入的理解。
1.3 目的在本文中,我们的主要目的是对qstyleoptiontitlebar进行深入探讨,包括其定义、作用、属性和用法,以及在界面设计中的应用。
通过对qstyleoptiontitlebar的详细分析,我们旨在帮助读者更好地理解和运用这一工具,提高界面设计的效率和质量。
Document For QT
一、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无边框窗体最大化遮挡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之实现360安全卫士主界面
复制代码
1. //鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
m_rectRestoreWindow = geometry(); setGeometry(qApp->desktop()->availableGeometry()); } else { setGeometry(m_rectRestoreWindow); } m_bMaxWin = !m_bMaxWin; } } 其中设置鼠标形状的代码如下: 复制代码 1. //设置鼠标样式 void MainWindow::SetCursorStyle(enum_Direction direction) { //设置上下左右以及右上、右下、左上、坐下的鼠标形状 switch(direction) { case eTop: case eBottom: setCursor(Qt::SizeVerCursor); break; case eRight: case eLeft: setCursor(Qt::SizeHorCursor); break;
SetCursorStyle(m_eDirection);
}
else
{
int nXGlobal = event->globalX();
int nYGlobal = event->globalY();
SetDrayMove(nXGlobal,nYGlobal,m_eDirection);
QT(4).窗口、对话框、状态栏、菜单栏
QT(4).窗⼝、对话框、状态栏、菜单栏1、坐标体系以左上⾓为原点,X向右增加,Y向下增加。
对于嵌套窗⼝,其坐标是相对于⽗窗⼝来说的。
2、QWidget所有窗⼝及窗⼝控件都是从QWidget直接或间接派⽣出来的。
3、QMainWindowQMainWindow是⼀个为⽤户提供主窗⼝程序的类,包含⼀个菜单栏(menubar)、多个⼯具栏(tool bars)、多个锚接部件(dock widgets)、⼀个状态栏(status bar)及⼀个中⼼部件(central widget),是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。
1、菜单栏⼀个主窗⼝最多只有⼀个菜单栏。
位于主窗⼝顶部、主窗⼝标题栏下⾯。
创建菜单栏,通过QMainWindow类的menubar()函数获取主窗⼝菜单栏指针QMenuBar *menuBar() const创建菜单,调⽤QMenu的成员函数addMenu来添加菜单QAction*addMenu(QMenu * menu)QMenu*addMenu(const QString & title)QMenu*addMenu(const QIcon & icon, const QString & title)创建菜单项,调⽤QMenu的成员函数addAction来添加菜单项QAction*activeAction() constQAction*addAction(const QString & text)QAction*addAction(const QIcon & icon, const QString & text)QAction*addAction(const QString & text, const QObject * receiver,const char * member, const QKeySequence & shortcut = 0)QAction*addAction(const QIcon & icon, const QString & text,const QObject * receiver, const char * member,const QKeySequence & shortcut = 0)Q t 并没有专门的菜单项类,只是使⽤⼀个QAction类,抽象出公共的动作。
给初学Qt者的小TIP
给初学Qt者的小TIP1、Hello, Qt!我们以一个非常简单的 Qt 程序开始 Qt 的学习。
我们首先一行行的分析代码,然后我们将会看到怎样编译和运行这个程序。
1 #include <QApplication>2 #include <QLabel>3 int main (int argc, char *argv [])4 {5 QApplication app (argc, argv);6 QLabel *label = new QLabel ("Hello Qt!");7 label->show ();8 return app. exec ();9 }第 1 行和第 2 行包含了两个类的定义:QApplication 和 QLabel。
对于每一个 Qt 的类,都会有一个同名的头文件,头文件里包含了这个类的定义。
因此,你如果在程序中使用了一个类的对象,那么在程序中就必须包括这个头文件。
第 3 行是程序的入口。
几乎在使用 Qt 的所有情况下,main()函数只需要在把控制权转交给 Qt 库之前执行一些初始化,然后 Qt 库通过事件来向程序告知用户的行为。
argc 是命令行变量的数量,argv 是命令行变量的数组。
这是一个 C/C++特征。
它不是 Qt 专有的,无论如何 Qt 需要处理这些变量第 5 行定义了一个 QApplication 对象 App。
QApplication 管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。
App 的创建需要 argc 和 argv 是因为 Qt 支持一些自己的命令行参数。
在每一个使用Qt 的应用程序中都必须使用一个QApplication 对象,并且在任何 Qt 的窗口系统部件被使用之前创建此对象是必须的。
App 在这里被创建并且处理后面的命令行变量(比如在 X 窗口下的-display)。
请注意,所有被 Qt 识别的命令行参数都会从 argv中被移除(并且 argc 也因此而减少)。
Qt 5开发及实例 第5章 Qt 5主窗口
——Qt 5主窗口构成
01
基本元素
1.菜单栏 2.状态栏 3.工具栏 4.锚接部件 5.中心部件
基本元素
QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏 (tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序(如文本编辑器、图片编辑器等)的基础。本章将对此进行详细介绍。Qt主 窗口界面布局如图5.1所示。
(6)主函数ImgProcessor类声明中的createActions()函数用于创建所有的动作、createMenus()函数用于 创建菜单、createToolBars()函数用于创建工具栏;接着声明实现主窗口所需的各个元素,包括菜单、工具 栏及各个动作等;最后声明用到的槽函数,打开“imgprocessor.h”文件,添加如下代码。
{
//在imageLabel对象中放置图像
showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
}
}
其中, (a) showWidget =new ShowWidget(this)、setCentralWidget(showWidget):创建放置图像QLabel和文本编辑框 QTextEdit的QWidget对象showWidget,并将该QWidget对象设置为中心部件。
#include "showwidget.h" #include <QHBoxLayout> ShowWidget::ShowWidget(QWidget *parent):QWidget(parent) {
Qt设置窗口属性setWindowFlags函数
Qt设置窗⼝属性setWindowFlags函数说明:setWindowFlags函数就是设置窗⼝属性,本博客主要分析此函数的参数主要是记录⼀下项⽬中遇到的问题。
主要使⽤的是WindowsType枚举enum WindowType {Widget = 0x00000000,Window = 0x00000001,Dialog = 0x00000002 | Window,Sheet = 0x00000004 | Window,Drawer = 0x00000006 | Window,Popup = 0x00000008 | Window,Tool = 0x0000000a | Window,ToolTip = 0x0000000c | Window,SplashScreen = 0x0000000e | Window,Desktop = 0x00000010 | Window,SubWindow = 0x00000012,WindowType_Mask = 0x000000ff,MSWindowsFixedSizeDialogHint = 0x00000100,MSWindowsOwnDC = 0x00000200,X11BypassWindowManagerHint = 0x00000400,FramelessWindowHint = 0x00000800,WindowTitleHint = 0x00001000,WindowSystemMenuHint = 0x00002000,WindowMinimizeButtonHint = 0x00004000,WindowMaximizeButtonHint = 0x00008000,WindowMinMaxButtonsHint = WindowMinimizeButtonHint | WindowMaximizeButtonHint,WindowContextHelpButtonHint = 0x00010000,WindowShadeButtonHint = 0x00020000,WindowStaysOnTopHint = 0x00040000,// reserved for Qt3Support:// WMouseNoMask = 0x00080000,// WDestructiveClose = 0x00100000,// WStaticContents = 0x00200000,// WGroupLeader = 0x00400000,// WShowModal = 0x00800000,// WNoMousePropagation = 0x01000000,CustomizeWindowHint = 0x02000000,WindowStaysOnBottomHint = 0x04000000,WindowCloseButtonHint = 0x08000000,MacWindowToolBarButtonHint = 0x10000000,BypassGraphicsProxyWidget = 0x20000000,WindowOkButtonHint = 0x00080000,WindowCancelButtonHint = 0x00100000,WindowSoftkeysVisibleHint = 0x40000000,WindowSoftkeysRespondHint = 0x80000000}Qt::Widget: QWidget构造函数的默认值,如果新的窗⼝部件没有⽗窗⼝部件,则它是⼀个独⽴的窗⼝,否则就是⼀个⼦窗⼝部件Qt::Window: ⽆论是否有⽗窗⼝部件,新窗⼝部件都是⼀个窗⼝,通常有⼀个窗⼝边框和⼀个标题栏Qt::Dialog: 新窗⼝部件是⼀个对话框,它是QDialog构造函数的默认值Qt::Sheet:新窗⼝部件是⼀个Macintosh表单(sheet)Qt::Drawer: 新窗⼝部件是⼀个Macintosh抽屉(drawer)Qt::Popup: 新窗⼝部件是⼀个弹出式顶层窗⼝Qt::Tool: 新窗⼝部件是⼀个⼯具(tool)窗⼝,它通常是⼀个⽤于显⽰⼯具按钮的⼩窗⼝。
Qt窗口的一些简单设置-标题、图标、最大化最小化按钮、任务栏图标
Qt窗⼝的⼀些简单设置-标题、图标、最⼤化最⼩化按钮、任务栏图标零零碎碎看了很多Qt例⼦,有⼀些很零散的窗体控制⽅法,在这总结⼀些。
1.更改窗体标题this->setWindowTitle("窗体标题");窗体标题”就是更改的窗体标题2.控制窗体⼤⼩1this->setMaximumSize(300,300); //窗体最⼤尺⼨2this->setMinimumSize(300,300); //窗体最⼩尺⼨3this->setMinimumHeight(300); //单独设置窗体⾼的最⼩值4this->setMaximumWidth(300); //单独设置窗体宽的最⼩值也可以通过窗体布局控制窗体⼤⼩1 QGridLayout *mainLayout = new QGridLayout; //窗体中控件为⽹格布局2 mainLayout->setSizeConstraint(QLayout::SetFixedSize); //布局⼤⼩不变在构造函数中的这个函数强制设置窗体的布局为固定⼤⼩,⽤户不可⾃⾏调整对话框⼤⼩。
布局管理器将会负责调整⼤⼩的任务,当⼀些⼦窗⼝期间显⽰或隐藏的时候⾃动的调整对话框的⼤⼩,以保证对话框总是以优化了的⼤⼩显⽰。
在官⽅⽂档中setSizeConstraint给的解释为:sizeConstraint:SizeConstraint. This property holds the resize mode of the layout.这个函数主要是通过布局管理器对布局⼤⼩进⾏限制,与上⾯介绍的窗体⼤⼩有所不同。
函数SetFixedSize如下:void QWidget::setFixedSize(const QSize &s);设置控件的最⼤和最⼩尺⼨为s,防⽌控件⼤⼩的变化。
3.更改窗体图标⾸先在项⽬右键-->添加新⽂件,弹出如下对话框在左侧选中Qt,右侧选择Qt Resource File,然后Choose,页⾯如下:如果路径没错的话就⾃⼰命⼀个名字例如:icon,然后下⼀步,⼀路next知道完成。
Qt标题栏(标题、图标)设置
Qt标题栏(标题、图标)设置
1. 标题设置
MainWindow::setWindowTitle(tr("your title"));
2. 标题栏图标设置
步骤如下(在windows环境下):
首先选择一个icon图标,假设为title.ico;
然后新建一个文本文件,在文本中加上这样一句话:IDI_ICON1 ICON DISCARDABLE "title.ico" 注意就只加这一句,关闭文本,将文本重命名,将后缀修改为.rc,比如将名字修改为titltico.rc;
最后用文本文件打开Qt工程文件.pro,在打开的文件最后新添加一行:RC_FILE = titleico.rc ,保存
注意:两次添加时要注意与前面的文件名称保持一致。
重新编译,就改变了标题栏的图标,而且.exe文件的图标和标题栏图标一样了。
Qt编写自定义控件插件路过的坑及注意事项
Qt编写⾃定义控件插件路过的坑及注意事项Qt⾃定义插件注意事项:1:每个Qt库bin⽬录的designer可执⾏⽂件都是和该库同⼀个编译器编译的,可⽤,如果想要集成到Qt Creator中,则需要注意版本,⼀般在windows上的Qt Creator版本是MSVC的,则需要对应的Qt库也是MSVC编译的,库版本和编译器版本必须保持⼀致才能是顺利集成到Qt Creator的重要前提。
2:⾃定义控件的名称不能⼩写,否则拖过去的控件⾃动⽣成的默认名称和类名⼀样,会编译通不过。
这个问题坑了我很久,造成⾃动⽣成的UI代码保存,⼀直没有怀疑,后⾯才发现⾃动⽣成的代码类名和实例名称⼀样,冲突导致的。
3:⾃定义控件类头⽂件引⼊,Qt5.7以下版本为#include <QtDesigner/QDesignerExportWidget> 以上版本为#include<QtUiPlugin/QDesignerExportWidget>4:类名前必须加⼊ QDESIGNER_WIDGET_EXPORT 宏。
否则集成到Qt Creator 中编译会报错。
不加的话可以在设计器中加载,但是编译会报错。
5:如果将⽣成好的dll⽂件放到Qt库⽬录下的 plugins\designer 下,可以在 designer 中看到。
放到Qt Creator下的 bin\plugins\designer 则可以集成到Qt Creator中。
6:将⾃定义控件的头⽂件、dll⽂件、lib(mingw编译器为.a)⽂件复制出来,放到include(可⾃⼰随便命名,我这⾥习惯⽤include)⽬录,将include⽬录放到项⽬的源码⽂件下,在使⽤了⾃定义控件的项⽬的pro⽂件中,增加两⾏ INCLUDEPATH += $$PWD/include LIBS += $$PWD/include/***.lib(mingw编译器为.a) ,这样可以正常编译,但是编译完成后不能运⾏,还需要将对应⾃定义控件的dll⽂件复制到可执⾏⽂件同⼀⽬录即可,⾄此⼤功告成。
实战PyQt5:113-QSS定制窗口的标题栏
实战PyQt5:113-QSS定制窗口的标题栏定制标题栏在前面的学习中可以看到,我们可以使用QSS为窗口的部件定义各种炫酷的效果,但是一个窗口的标题栏始终是和所使用的操作系统相关,在Win7下,是win7样式的标题栏,在Win10下是win10样式的标题栏,在Ubuntu下是Ubuntu样式的标题栏,Qt这样设计,保持了应用在不同的平台下与相应的系统的外观上的统一。
但是也带来了一些问题,比如我们在窗口中使用深色主题,但是标题栏一直保持浅色主题,看起来有些不协调。
如果想在标题栏和窗口统一使用一个主题样式,则需要对标题栏进行定制处理。
在Qt下,可以将窗口设置成无标题样式,我们可以在无标题样式下,布局一个自己需要的标题栏。
定义对应标题栏按钮功能,同时需要添加对窗口的移动,缩放等操作。
为了达到上述目的和方便移植,定义类WindowDragger来作为标题栏的父部件,它主要是处理一些鼠标事件和绘图事件。
定义类FramelessWindow作为窗口的外框控件,使用其定义的setContent函数将要显示的窗口放入其中,就可以轻松完成标题栏的替换。
测试演示工程代码文件包括:•resource.qrc, 定义资源文件;•windowdragger.py, 实现类WindowDragger,控制标题栏的鼠标操作和绘图控制;•framelesswindow.py, 实现类FramelessWindow,实现一个带定制标题栏的框架;•mainwindow.py, 定义主窗口;•fw_demo.py 主程序,运行它,演示最终效果。
•images/icon_window_close.png, 标题栏的关闭图标;•images/icon_window_maximize.png, 标题栏的最大化图标;•images/icon_window_minimize.png, 标题栏的最小化图标;•images/icon_window_restore.png, 标题栏的恢复图标。
qt自定义窗口的标题栏
因为标题栏属于窗口管理器控制,也就受限于操作系统,所以直接利用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. else59. {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.}。
Quick之QML自定义窗口标题栏
Quick之QML⾃定义窗⼝标题栏前⾔`在实际的开发中,QML⾃带的组件基本上不会直接⽤,因为需要花⾥胡哨的样式,所以需要我们。
`运⾏效果知识点ApplicationWindowItemMouseAreaButton实现思想// <1> 隐藏原⽣窗⼝的系统标题栏// Qt.Window >> 指定该部件为窗⼝属性。
请注意,如果⼩部件没有⽗级,则⽆法取消设置此标志。
// Qt.FramelessWindowHint >> 设置窗⼝属性为⽆边框样式flags: Qt.Window | Qt.FramelessWindowHint<2> ⾃定义窗⼝标题栏样式// 直接定义⼀个 Item 或者其他组件作为窗⼝的标题栏即可// 窗⼝的id为 rootWindow// 处理窗⼝ onTitleChanged 信号,同步到⾃定义标题栏即可Rectangle {id : rootWindowMenuBarwidth: rootWindow.widthheight: 40Text {id: rootWindowTitleBarTitleTexttext: rootWindow.title}}<3> ⾃定义窗⼝标题栏事件// MouseArea >> 不可见的组件,其功能提供⿏标处理信号MouseArea {MouseArea {anchors.fill: rootWindowTitleBar// 只处理⿏标左键acceptedButtons: Qt.LeftButton// 接收⿏标按下事件onPressed: {rootWindow.rootWindowTitleMousePos = Qt.point(mouseX,mouseY)rootWindow.isMoveWindow = true}// ⿏标释放,关闭窗⼝移动flagonReleased: {if(mouse.button === Qt.LeftButton){rootWindow.isMoveWindow = false}}//onMouseXChanged: {if(rootWindow.isMoveWindow){rootWindow.x += mouseX - rootWindow.rootWindowTitleMousePos.x; }}onMouseYChanged: {rootWindow.y += mouseY - rootWindow.rootWindowTitleMousePos.y; }}<4> ⾃定义窗⼝标题栏样式Button {id : pushbtnWindowsClosewidth: 30height: 30anchors.margins: 5anchors.right: rootWindowTitleBar.rightanchors.topMargin: 5anchors.verticalCenter: parent.verticalCentertext: "X"}Button {id : pushbtnWindowsMaximizewidth: 30height: 30anchors.margins: 5anchors.verticalCenter: parent.verticalCenteranchors.right: pushbtnWindowsClose.lefttext: "⼝"}Button {id : pushbtnWindowsMinimizewidth: 30height: 30anchors.margins: 5anchors.verticalCenter: parent.verticalCenteranchors.right: pushbtnWindowsMaximize.lefttext: "⼀"}完整QML代码import QtQuick 2.12import QtQuick.Window 2.12import QtQuick.Controls 2.5ApplicationWindow {property bool isMoveWindow: falseproperty point rootWindowTitleMousePos: Qt.point(x,y)id : rootWindowvisible: truewidth: 640height: 480title: qsTr("Hello World")flags: Qt.Window | Qt.FramelessWindowHintonTitleChanged: rootWindowTitleBarTitleText.text = titleRectangle {id : rootWindowTitleBarwidth: rootWindow.widthheight: 40border.color: "red"color: "black"Text {id: rootWindowTitleBarTitleTexttext: rootWindow.titlecolor: "white"anchors.verticalCenter: parent.verticalCenter}// 为窗⼝标题栏添加⿏标事件MouseArea {anchors.fill: rootWindowTitleBar// 只处理⿏标左键acceptedButtons: Qt.LeftButton// 接收⿏标按下事件onPressed: {rootWindow.rootWindowTitleMousePos = Qt.point(mouseX,mouseY)rootWindow.isMoveWindow = true}// ⿏标释放,关闭窗⼝移动flagonReleased: {if(mouse.button === Qt.LeftButton){rootWindow.isMoveWindow = false}}//onMouseXChanged: {if(rootWindow.isMoveWindow){rootWindow.x += mouseX - rootWindow.rootWindowTitleMousePos.x; }}onMouseYChanged: {rootWindow.y += mouseY - rootWindow.rootWindowTitleMousePos.y; }}Button {id : pushbtnWindowsClosewidth: 30height: 30anchors.margins: 5anchors.right: rootWindowTitleBar.rightanchors.topMargin: 5anchors.verticalCenter: parent.verticalCentertext: "X"}Button {id : pushbtnWindowsMaximizewidth: 30height: 30anchors.margins: 5anchors.verticalCenter: parent.verticalCenteranchors.right: pushbtnWindowsClose.lefttext: "⼝"}Button {id : pushbtnWindowsMinimizewidth: 30height: 30anchors.margins: 5anchors.verticalCenter: parent.verticalCenteranchors.right: pushbtnWindowsMaximize.lefttext: "⼀"}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因为标题栏属于窗口管理器控制,也就受限于操作系统,所以直接利用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.}。