当前位置:文档之家› QT窗口创建过程

QT窗口创建过程

QT窗口创建过程
QT窗口创建过程

1. QT创建窗口程序、消息循环和WinMain函数

使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题。在这里我将记录一下我跟踪QT源码学习到的一些知识。

我的开发环境是VC6.0+QT4.3.3。QT已经不为VC6.0提供addin了,所以有的时候我也会使用EclipseCDT来编写代码,因为有了QT for Eclipse的plugin写代码会方便一些。

我们在学习QT的时候,接触的第一个程序就是下面的helloworld程序:

view plain

1.#include

2.#include

3.

4.int main(int argc, char *argv[])

5.{

6. QApplication app(argc, argv);

7. QPushButton hello("Hello world!");

8. hello.resize(100, 30);

9. hello.show();

10. return app.exec();

11.}

这个程序的作用很多手册和文档都已经讲了,讲的也都很细致,非常不错。

但是喜欢钻研,深入的童鞋也许开始注意了int main(int argc, char *argv[]),这个main函数是标准的main函数,而windows应用程序的入口是winmain函数,而main函数是命令行程序的入口。 win下窗口程序都有RegisterClass,和消息循环,QT是如何RegisterClass和创建消息循环的?

下面我们将来一起学习一下QT的源码来解释一下这个main函数和整个窗口程序的创建过程:

设置好路径后,我们先F10一下,看看这个程序到底是从哪里开始运行的。

程序跳到了/winmain/qtmain_win.cpp文件的WinMain函数中,再看这个文件上面的宏定义:#define main qMain

继续看:在WinMain函数中调用了我们自己定义的main函数:int result = main(argc, argv.data());

哇塞,原来如此啊。原来我们写的main函数是假的。哈哈。

再来看一下QT是如何创建窗体和消息循环的

首先我们来到QApplication的构造函数:

QApplication::QApplication(int &argc, char **argv, int _internal)

: QCoreApplication(*new QApplicationPrivate(argc, argv, GuiClient)) { Q_D(QApplication); d->construct();

QApplicationPrivate::app_compile_version = _internal;}

很明显,首先调用的是QApplicationPrivate的构造函数。大家注意第三个参数:QApplication::Type type

这事Type类型的定义:enum Type { Tty, GuiClient, GuiServer };

下面是代码注释中对Type类型的解释:

/enum QApplication::Type

/value Tty a console application

/value GuiClient a GUI client application

/value GuiServer a GUI server application (for Qt for Embedded Linux)

当程序运行到hello.show()的时候调用了QWidgetPrivate::create_sys函数。

在这里我们看到调用了类似RegisterClass的函数:QString windowClassName = qt_reg_winclass(q);

这里的q是指向QWidget的指针(我们先忽略掉这里)。

以及包括后面的CreateWindow,ShowWindow等等我们熟悉的WindowsAPI函数

const QString qt_reg_winclass(QWidget *w) 函数的原型是在

qapplication_win.cpp中定义的。我们转到qt_reg_winclass函数的实现中。

我们就看到了windows的 API函数RegisterClass和窗口消息处理函数:

wc.lpfnWndProc = (WNDPROC)QtWndProc;

我们看一下QtWndProc的实现,原来窗口消息都是在这里进行处理的啊!

至于最后一句app.exec(); 调用了QCoreApplication的Exec函数,在这个函

数中我们看到了下面创建消息循环的代码

QEventLoop eventLoop;

self->d_func()->in_exec = true;

int returnCode = eventLoop.exec();

在QCoreApplication.cpp中的注释是这样解释的:

The application will enter the event loop when exec() is called. exit() will not return until the event loop exits, e.g., when quit() is called.

到这里,main和WinMain函数到底是怎么回事,以及QT是怎么创建窗口和消息循环的,我们已经非常清楚了。

2. Qt创建窗体的过程

前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使

用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用

关系,效率实在是太低了,最近总结出一个更简便的方法,就是利用Qt Creator 这个IDE。

带来的好处是:

1.Qt Creator可以很方便的跟踪代码的调用,这样大大提高了分析代码的速度。

2.函数间的调用关系能更加直观的找到。

3.便于对代码的纵向关系的把握。

带来的坏处:

1. 只是展现了调用到的函数或者类的关系。

2. 缺少对类、某一组类、函数间关系的整体把握。

上面总结一下自己在QT源码解析时候用到的方法,下面开始步入正题。Qt 创建窗体的过程,由于我对linux不是很熟悉,下面我所有的分析都是基于windows下的。

关于windows下利用API创建窗体。我这里就不多解释了,直接给出代码,然后结合下面的代码来分析一下Qt创建窗体的过程。

详细的解释请参考:

John Chen大牛的博文:WIN32 SDK界面编程

view plain

1.#include

2.LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

3.int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

4. PSTR szCmdLine, int iCmdShow)

5.{

6. static TCHAR szAppName[] = TEXT ("HelloWin") ;

7.

8. HWND hwnd ;

9. MSG msg ;

10.

11. WNDCLASS wc ;

12. wc.style = CS_HREDRAW | CS_VREDRAW ;

13. wc.lpfnWndProc = WndProc ;

14. wc.cbClsExtra = 0 ;

15. wc.cbWndExtra = 0 ;

16. wc.hInstance = hInstance ;

17. wc.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;

18. wc.hCursor = LoadCursor (NULL, IDC_ARROW) ;

19. wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

20. wc.lpszMenuName = NULL ;

21. wc.lpszClassName = szAppName ;

22. if (!RegisterClass (&wc))

23. {

24. MessageBox (NULL, TEXT ("This program requires Windows NT!"), szApp

Name, MB_ICONERROR) ;

25. return 0 ;

26.

27. }

28. hwnd = CreateWindow (szAppName, // window class name

29. TEXT (“hello”), // window caption

30. WS_OVERLAPPEDWINDOW, // window style

31. CW_USEDEFAULT, // initial x position

32. CW_USEDEFAULT, // initial y position

33. CW_USEDEFAULT, // initial x size

34. CW_USEDEFAULT, // initial y size

35. NULL, // parent window handle

36. NULL, // window menu handle

37. hInstance, // program instance handle

38. NULL) ; // creation parameters

39. ShowWindow (hwnd, iCmdShow) ;

40. UpdateWindow (hwnd) ;

41. while (GetMessage (&msg, NULL, 0, 0))

42. {

43. TranslateMessage (&msg) ;

44. DispatchMessage (&msg) ;

45. }

46. return msg.wParam ;

47.

48.}

49.LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lP

aram)

50.{

51. HDC hdc ;

52. PAINTSTRUCT ps ;

53. RECT rect ;

54. switch (message)

55. {

56. case WM_PAINT:

57. hdc = BeginPaint (hwnd, &ps) ;

58. GetClientRect (hwnd, &rect) ;

59. DrawText (hdc, TEXT ("the WM_PAINTmessage"), -1, &rect,DT_SINGLELIN

E | DT_CENTER | DT_VCENTER) ;

60. EndPaint (hwnd, &ps) ;

61. return 0 ;

62. case WM_DESTROY:

63. PostQuitMessage (0) ;

64. return 0 ;

65. }

66. return DefWindowProc (hwnd, message, wParam, lParam) ;

67.}

先写一个最简单的Qt程序:

view plain

1.#include

2.#include

3.

4.int main(int argc, char *argv[])

5.{

6. QApplication a(argc, argv);

7. QPushButton w("hello kitty");

8. w.show();

9. return a.exec();

10.}

来分析一下这个窗体程序是如何创建的。

首先关于main函数和winmain函数,为什么Qt的窗口程序是用main函数而非winmain,在我的另外一篇博文中有解释:QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数这里不再解释

Windows窗体创建一定会调用RegisterClass这个函数的,我们在QTDIR/src 里面搜索一下,有两个文件有这个函数一个是qapplication_win.cpp另外一个是qeventdispatcher_win.cpp,两个的作用不同,这次我们先研究qapplication_win.cpp 中的RegisterClass函数,因为这个是与窗体创建有关的,下一篇QT源码解析(八)Qt是如何处理windows消息的将会介绍qeventdispatcher_win.cpp中的RegisterClass 的作用。

我们先将断点设置在qapplication_win.cpp中的qt_reg_winclass 函数里,然后开始调试,运行到断点,然后我们看一下call stack如下图:

下面红色的框中为Call stack,我们可以看到函数调用的顺序,真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法…………

QtWndProc就是窗体的回调函数,在RegisterClass的时候传给WNDCLASS 结构的,QtWndProc同上面的API创建窗体的函数WndProc。

我们看一下QtWndProc的代码,也是一个switch (message) 然后一堆case 来处理消息,最后也是调用DefWindowProc将不归他处理的消息交还给系统。

解析QdateTime

本篇主要侧重于通过分析一个问题来解析QDateTime的代码

问题提出:

前几天一个朋友问我一个QDateTime的问题:

QDateTime d = QDateTime::fromString("Mon,26 Apr 2010, 08:21:03","ddd,d MMM yyyy, hh:mm:ss");

这种格式返回的QDateTime总是null。

问题分析:

于是我亲自试验了一下,没错,果然是null

Q_ASSERT(d.isNull());

然后拿出Qt Assistant,自己对照QDateTime的format格式看了一下,format的字符串的确没有任何错误,那错误到底出在哪里呢?

于是开始调试跟踪,看看这个问题到底是出在什么地方。

第一个疑点出现在这里:

注意QLocale::system();这个地方。

然后继续跟踪发现第二个疑点:

看清楚了么?看不清楚没有关系,我已经圈出来了。

在QDateTimeParser::fromString函数中t是我们要解析的字符串,而val是一个1900-1-1的QDateTime值,看看他俩什么区别(就是上图圈出来的那两部分)?没错,一个是英文的,一个是中文的。

真相距离我们越来越近了,接下来继续跟踪。

findDay函数for循环这一部分的意思就是循环比较”星期一”到”星期日”和传入的字符串”星期几”这一部分是否相等,传入的字符串中”星期几”这一部分时”mon”,显然不会相等了。于是我们找到了错误的根源。

错误是找到了,但是我们该如何解决这个错误呢?

根据上面提到的两个疑点,我们判断可能跟QLocale有关。我的系统是简体中文版的winxp,系统缺省的defaultLocale语言就是chinese,国家就是china。

问题解决:

所以解决这个问题有两个办法:

1.装个英文版的系统。上面的代码肯定可以正确执行。

2.想办法修改QLocale,或者看看QLocale有没有提供相应的方法。

办法1显然是不好办了,那就只好寻找办法2了。

首先查找QLocale帮助,发现有一个setDefault()方法。我们设置了之后起作用么?看看图1中的代码defaultLocale = QLocale::system();这里defaultLocale又被重置了,所以即使我们设置了也不会起作用的。

继续看帮助:发现QLocale有一个toDateTime方法:

QDateTime QLocale::toDateTime ( const QString & string, const QString & format ) const

没错,就是他了。

下面,我们构造一个语言是英文的QLocale,然后toDateTime就可以了。

QLocale lo(QLocale::C);

QDateTime d = lo.toDateTime("Mon,26 Apr 2010, 08:21:03","ddd,d MMM yyyy, hh:mm:ss");

Q_ASSERT(d.isValid());

总结:

1.QDateTime的format格式与QLocale无关,但是format的结果是与QLocale

相关的。

2.QDateTime用的是系统的时区,所以在用utc的时候也要注意。

3.以前用wx的时候好像也遇到过类似的问题,时间很久了,就忘记了,当时

也没有总结,只是大体记得处理这种问题的过程。依稀记得好像delphi的某个控件也是要修改system中时间,日期的format格式的,具体怎么回事也想不起来了。

QT习题

QT习题 一、名词解释 1、虚函数: 2、回调函数: 3、内联函数: 4、信号与插槽: 5、私有函数: 6、构造函数: 7、公有函数: 8、内联函数: 9、信号与插槽: 10、析构函数: 二、判断题 1、在QT中Qwidget不可以作为应用程序的窗口()。 2、在创建窗口部件的时候,窗口部件通常不会显示出来()。 3、布局管理器不是一个窗口部件() 4、FindDialog(QWidget *parent = 0);父参数为NULL,说明有父控件。() 5、show()显示的对话框是模式对话框。用exec()显示的对话框是无模式对话框。 () 6、布局管理器派生自QObject。() 7、Q_OBJECT是一个宏定义,如果类里面用到了signal或者slots,就必须要声 明这个宏。() 8、FindDialog(QWidget *parent = 0);父参数为NULL,说明没有父控件。() 9、槽可以是虚函数,可以是公有的,保护的,也可是私有的。() 10、show()显示的对话框是无模式对话框。用exec()显示的对话框是模式对话 框。() 三、简答题 1、简述一下信号与插槽机制。 2、简述布局管理器的功能,列举3个布局管理器。 3、简述使用Qt设计师,在创建对话框时主要包含哪几个基本步骤? 4、GUI程序通常会使用很多图片,请简述3种提供图片的方式。 5、列举几种Qt中会产生绘制事件的情况。 6、Update()与repaint()之间的区别? 7、对窗体上的控件进行布局管理一般有哪几种方式,简述一下其缺点。 8、简述事件和信号的特点和区别。 9、简述主函数中创建QApplication对象功能。 10、简述使用Qt设计师,在创建对话框时总是包含哪几个基本步骤?

Qt 编写多窗口程序

编写多窗口程序 导语 程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 程序里我们先建立一个工程,设计主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 在这一篇还会涉及到代码里中文字符串显示的问题。 目录 一、添加主窗口 二、代码中的中文显示 三、添加登录对话框 四、使用自定义的对话框类 正文 一、添加主窗口 1.我们打开Qt Creator,新建Qt Gui应用,项目名称设置为“nWindows”,在类信息界面保持基类为QMainWindow,类名为MainWindow,这样将会生成一个主窗口界面。 2.完成项目创建后,打开mainwindow.ui文件进入设计模式,向界面上拖入一个Push Button,然后对其双击并修改显示文本为“按钮”,如下图所示。 3.现在运行程序,发现中文可以正常显示。在设计模式可以对界面进行更改,那么使用代码也可以完成相同的功能,下面就添加代码来更改按钮的显示文本。

二、代码中的中文显示 1.我们点击Qt Creator左侧的“编辑”按钮进入编辑模式,然后双击mainwindow.cpp文件对其进行编辑。在构造函数MainWindow()中添加代码: MainWindow::MainWindow(QWidget*parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->pushButton->setText("新窗口");//将界面上按钮的显示文本更改为“新窗口”} 这里的ui对象就是界面文件对应的类的对象,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮部件Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton,这里就是通过这个属性来获取部件对象的。 我们使用了QPushButton类的setText()函数来设置按钮的显示文本,现在运行程序,效果如下图所示。 2.我们发现,在代码中来设置按钮的中文文本出现了乱码。这个可以有两种方法来解决,一个就是在编写程序时使用英文,当程序完成后使用Qt语言家来翻译整个软件中的显示字符串;还有一种方法就是在代码中设置字符串编码,然后使用函数对要在界面上显示的中文字符串进行编码转换。因为翻译一个软件很麻烦,对于这些小程序,我们希望中文可以立即显示出来,所以下面来讲解第二种方法。 3.设置字符串编码,可以使用QTextCodec类的setCodecForTr()函数,一般的使用方法就是在要进行编码转换之前调用该函数,下面我们在main.cpp文件中添加代码:

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局 常见的软件窗口大小改变(最大化、手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少。 Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout、QVBoxLayout、QGridLayout,空的地方使用spacer 控件进行填充,因此首先将窗体空间使用布局管理典型应用如下图所示。 我这里使用QGridLayout,按住Ctrl多选需要布局的窗体控件,右键-布局-栅格化局,根据需要进行调整。 要想是控件根据窗体进行调整,最为重要的一点就是设置窗口部件的大小策略,各控件均有这一项设置,如下图所示。

这部分具体的参数解释摘录如下: 结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。 控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值: A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。 B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以 放大。 C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小 的允许尺寸。

Qt自定义窗口部件

【原创】Qt自定义窗口部件 QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)改进法 1、改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。把这两个文件拷贝到想要的项目中。 HexspinBox.h HexspinBox.cpp

2、在需要开发的项目中的窗口中, 1、用Qt Designer创建一个新的窗体main.ui,把控件箱里的QSpinBox添加到窗体中。 2、右击微调框,选择“Promote to ”上下文菜单。 3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h” 好了。在ui生成的包含有QSpinBox的控件文件中,ui的源代码里面多了一段 HSpinBox QSpinBox

hspinbox.h
包含文件变为"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 源代码如下:

QT界面开发

1Qt4界面开发 1.1Q t历史 Qt是一个用于桌面系统和嵌入式开发的跨平台应用程序框架。它包括一个直观的API 和一个丰富的类库,以及用于GUI开发和国际化的集成工具,另外它支持Java?和C++开发。Qt让企业无须重新编写源代码,便可以构建运行在不同桌面操作系统和嵌入式设备上的软件应用程序。 Qt框架最早可公开获取是在1995年5月。最初是由Haavard Nord(TrollTech公司的首席执行官)和Eirik Chambe-Eng(TrollTech公司的董事会主席)。Haavard和Eirik 最早在特隆赫姆的挪威技术学院相遇,在那里他们双双获得了计算机科学硕士学位。 早在1991年,Haavard 就开始写一些最终成为Qt的类,并和 Eirik合力设计。在接下来的一年,Eirik提出了“信号和槽”的思想,一个现在已经被一些其他套装工具包含简单但功能强大的GUI编程范式。Haavard 接受了这一思想并手工生成了这一思想的代码实现。到1993年,Haavard和Eirik已经完成了Qt的第一个图形内核的开发并能用它来实现一些他们所需的物件。在这一年的年末,Haavard建议他们一起去经商,创建一个“世上最好的C++ GUI框架”。 字母“Q”被选为类的前缀是因为这个字母在Haavard的Emacs字体中看起来很漂亮。受到Xt(the X toolkit)的启发,字母“t”被追加来表示“toolkit”。公司在1994年5月4日成立,起初被命名为“Quasar Technologies”,之后被改名为“Troll Tech”,今天则被称为奇趣科技(Trolltech)。 1995年5月20日,Qt 0.90被上传到https://www.doczj.com/doc/a89830150.html,。六天后,这一发布在comp.os.linux.announce被宣布。这是Qt的第一个公共发行版。Qt可以被用在Windows 和Unix开发中,在两个系统中提供相同的API。Qt从一开始就可以在两种许可协议下获取:一个是商业开发中需要的商业许可协议,一个用于开源开发的自由软件版。 1996年3月,欧洲航天局成为Qt的第一个客户,一下买了十个Qt商业许可。Qt 0.97在同年的5月底发布,1996年9月24日,Qt 1.0发布。到了同年年底,Qt到达了版本1.1;拥有8个客户,每一个都在不同的国家,他们购买了18个商业许可。 Qt 1.2 在1997年4月发布。Matthias Ettrich利用Qt构建KDE的决定帮助Qt成为Linux C++ GUI 开发的实际标准,1997年9月Qt 1.3发布。 1998年9月,Qt 1的最后一个主要发行版1.40发布。Qt 2.0于1999年7月发布。Qt 2有了一个新的开源许可协议,发布许可协议(QPL),遵守开源的定义。1999年8月,Qt赢得了LinuxWorld的“最佳开发库/工具”大奖。 2000年奇趣科技发布了Qtopia核心(后来成为Qt/Embedded)。它被设计用来运行在嵌入式Linux设备上并提供了自己的窗口系统作为X11的一个轻量级代替。现在Qt/X11和Qtopia核心都可以通过GNU通用许可(GPL)获取。到2000年年底,奇趣科技成立了Trolltech Inc.(USA)并且发布了Qtopia的第一个版本,一个移动电话和PDAs应用程序平台。Qtopia赢得了2001和2002年LinuxWorld的“最佳嵌入式 Linux 解决方案”大奖,

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.

Qt 编写多窗口程序

编写多窗口程序 版权声明 该文章原创于Qt爱好者社区(https://www.doczj.com/doc/a89830150.html,),作者yafeilinux,转载请注明出处! 导语 程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 程序里我们先建立一个工程,设计主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 在这一篇还会涉及到代码里中文字符串显示的问题。 目录 一、添加主窗口 二、代码中的中文显示 三、添加登录对话框 四、使用自定义的对话框类 正文 一、添加主窗口 1.我们打开Qt Creator,新建Qt Gui应用,项目名称设置为“nWindows”,在类信息界面保持基类为QMainWindow,类名为MainWindow,这样将会生成一个主窗口界面。 2.完成项目创建后,打开mainwindow.ui文件进入设计模式,向界面上拖入一个Push Button,然后对其双击并修改显示文本为“按钮”,如下图所示。

3.现在运行程序,发现中文可以正常显示。在设计模式可以对界面进行更改,那么使用代码也可以完成相同的功能,下面就添加代码来更改按钮的显示文本。 二、代码中的中文显示 1.我们点击Qt Creator左侧的“编辑”按钮进入编辑模式,然后双击mainwindow.cpp文件对其进行编辑。在构造函数MainWindow()中添加代码: MainWindow::MainWindow(QWidget*parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->pushButton->setText("新窗口");//将界面上按钮的显示文本更改为“新窗口”} 这里的ui对象就是界面文件对应的类的对象,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮部件Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton,这里就是通过这个属性来获取部件对象的。 我们使用了QPushButton类的setText()函数来设置按钮的显示文本,现在运行程序,效果如下图所示。

Qt界面如何布局

关于Qt界面中对于相关控件进行布局管理 在用Qt进行用户界面应用程序的编程时,建议通过编写相关代码来生成和维护Qt控件,而不要用Qt Designer。这时对相应的Qt控件进行布局管理显得尤为重要。 常见的三种布局方式: 网格布局:QGridLayout 水平布局:QHBoxLayout 垂直布局:QVBoxLayout 步骤: 1)以单个的Qt控件为单位,先进行子块布局,分别对各个子块进行布局。 2)以步骤1)中的子块为单位,进行全局布局。 例如:我们要完成如下样式的Qt界面,整个Qt界面有ABCDEFXYZ共计9个Qt控件。 方法1: 1)用“网格布局”对ABCDEF(子块1)进行布局 QGridLayout *leftLay=new QGridLayout; 用“垂直布局”对XYZ(子块2)进行布局 QVBoxLayout *rightLay=new QVBoxLayout; 2)用“水平布局”对子块1(ABCDEF)、子块2(XYZ)进行全局布局 QHBoxLayout *mainLay=new QHBoxLayout; mainLay->addLayout(leftLay); mainLay->addLayout(rightLay); 方法2: 1)用“水平布局”对AB(子块1)进行布局 用“水平布局”对CD(子块2)进行布局 2)用“垂直布局”对子块1(AB)、子块2(CD)、E、F进行布局,形成子块3(ABCDEF)。3)用“垂直布局”对XYZ(子块4)进行布局 4)用“水平布局”对子块3(ABCDEF)、子块4(XYZ)进行全部布局

方法1: QGridLayout *leftLay=new QGridLayout; leftLay->addWidget(hostLabel,0,0); leftLay->addWidget(hostLineEdit,0,1); leftLay->addWidget(portLabel,1,0); leftLay->addWidget(portLineEdit,1,1); leftLay->addWidget(myCheckBox,2,0,1,2); leftLay->addWidget(myListWidget,3,0,1,2); leftLay->addWidget(msgLabel,4,0,1,2); QVBoxLayout *rightLay=new QVBoxLayout; rightLay->addWidget(logButton); rightLay->addWidget(sendButton); rightLay->addWidget(linkButton); QHBoxLayout *mainLay=new QHBoxLayout; mainLay->addLayout(leftLay); mainLay->addLayout(rightLay); setLayout(mainLay);

Qt基础教程之自定义对话框及调用方法

在一个应用程序设计中,为了实现一些特定的功能,必领设计自定义对话框。 自定义对话框的设计一般从 QDialog 继承,并且可以采用UI设计器可视化地设计对话框。对话框的调用一般包括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。 本节将通过实例 samp6_2 来详细介绍这些原理。图 1 是实例 samp6_2 的主窗口,及其设置表格行列数的对话框。 图 1 实例 samp6_2 主窗口及其设置表格行列数的对话框 主窗口采用 QTableView 和 QStandardltemModel、QltemSelectionModel 构成一个通用的数据表格编辑器,设计了 3 个对话框,分别具有不同的功能,并且展示对话框不同调用方式的特点: ?设置表格行列数对话框 QWDialogSize 该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。 这种对话框创建和调用方式适用于比较简单,不需要从主窗口传递大量数据做初始化的对话框,调用后删除对话框对象可以节约内存。

?设置表头标题对话框 QWDialogHeaders 图 2 是设置表格表头标题的对话框,该对话框在父窗口(本例中就是主窗口)存续期间只创建一次,创建时传递表格表头字符串列表给对话框,在对话框里编辑表头标题后,主窗口获取编辑之后的表头标题。 图 2 设置表格表头标题对话框 注意,对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时只是打开己创建的对话框对象。 这种创建和调用方式适用于比较复杂的对话框,需要从父窗口传递大量数据做对话框初始化。下次调用时不需要重复初始化,能提高对话框调用速度,但是会一直占用内存,直到父窗口删除时,对话框才从内存中删除。 ?单元格定位与文字设置对话框QWDialogLocate 图 3 是单元格定位和文字设置对话框,该对话框以非模态方式调用,显示对话框时还可以对主窗口进行操作,对话框只是浮动在窗口上方。在对话框里可以定位主窗口表格的某个单元格并设置其文字内容,在主窗口上的表格中单击鼠标时,单元格的行号、列号也会更新在对话框中。对话框关闭后将自动删除,释放内存。

如何在Qt中使用自定义数据类型 - zhezhelin - 博客园

如何在Qt中使用自定义数据类型 - zhezhelin - 博 客园 如何在Qt中使用自定义数据类型 Q_DECLARE_METATYPE,Qt自定义类型 这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样): 复制代码 QVariant 为了能在QVariant中使用自定义数据类型做,需要使用 Q_DECLARE_METATYPE()来向Qt的元系统声明这个自定义类型。如下列所示: 复制代码 在作为QVariant传递自定义数据类型时,需要使用QVariant::fromValue()或者qVariantFromValue: 复制代码 为了更方便一点,你可以在自定义类型中定义一个QVariant() 类型转换符: 复制代码 这样我们便可以像下面这样使用了: 复制代码 信号和槽 对于直接连接类型(默认情况下就是直接连接)而言,使用自定义数据类型做信号参数不需要做其他其他处理,就像内置数据类型一样: 复制代码 但在跨线程时如果你还这么做,编译器就会给出警告了: 复制代码 这时我们需要先注册Player: qRegisterMetaType<Player>("Player");

qRegisterMetaType<Player>( ); (上面那个是错误的,除非名字刚好和类名一样) connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&))); 复制代码 QDebug 最好是能这样: 复制代码 而不是这样: 复制代码 怎么做呢?我们需要对QDebug<<操作符重载一下: 复制代码 QDataStream 跟上面的QDebug很像,我们也需要重载一下<<操作符: 复制代码 QSettings 为了能在QSettings中使用自定义数据类型,需要让Qt的元系统知道有此类型,就像上面介绍QVariant部分一样,另外还要提供相应的QDataStream操作符,还必须注册这个流操作符: 复制代码 如此处理之后我们就可以像下面这样使用了: 复制代码 复制代码 参考: QString QSettingsPrivate::variantToString(const QVariant &v) { QString result;

Qt04使用Qt 设计师创建主窗口应用

实验4 使用Qt 设计师创建主窗口应用 4.1. 创建主窗体 使用Qt设计师来创建主窗口应用是非常方便的,其步骤与使用代码创建基本一样。 1.选择模板 首先,创建一个窗体,选择“Main Window”模板,创建一个空的主窗体,如下图: 2.创建资源 在资源浏览器中,点击编辑资源,如下图所示:

我们将要在程序中使用图标资源,因此在资源编辑对话框中,点击新建资源,首先创建资源文件,我们就创建一个名为resource.qrc的资源文件,然后在编辑区中,再添加前缀,我们以“\”作为资源的前缀,图标文件我们都放在images目录下,然后添加图标文件将该目录下的所有文件添加即可,如下图所示: 完成之后,我们可以在资源浏览器中看到添加的各个图标资源,如下图所示: 3.创建动作 在动作编辑器中,点击新建动作,进行动作的创建,在此过程中,可以设置动作的文本(显示在菜单项上的文本),对象名称,工具提示(鼠标放在动作上时显示的提示信息),图标(也就是浏览资源管理器中的资源,选择适当的图标资源),快捷键(鼠标点击快捷键区域,然后按下希望设置的快捷键即可),如下图所示:我们创建了一个newAction动作,对应“文件”菜单下的“新建”菜单项。

通过同样的方式,我们将程序中用到的所有动作创建完成,如下图: 4.将动作添加到工具栏和菜单上 首先创建工具栏,在主窗口中右键单击即可在弹出菜单中选择“添加工具栏”来添加,如下图: 要将动作添加到菜单和工具栏上,还需要创建菜单,这通过在主窗口中的“在这里输入”之处输入菜单的文本,并修改菜单的objectName即可,有了菜单和工具栏,就可以将动作添加到菜单和工具栏上了,这很简单,只要从动作编辑器中拖动动作放到相应的菜单和工具栏上即可,摆放动作的时候,可以根据需要插入分隔符,最终的结果如下图所示(注,菜单上的动作没有显示出来,但在对象查看器中可以看到已经添加到菜单上了):

QT简答+大题+填空

1、创建一个窗体对象后,要想显示该窗体,需要调用对象的_show()______ 方法,要想隐藏该窗体需要调用对象的__hide()_____方法。 2、MinGW 即Minimalist ____GNU_______For Windows,是将___GNU_开发工具移植到Win32 平台下的产物。 3 、Qt Creator 提供的默认基类只有QMainWindow 、_QWidget__ 和 __QDialog___________三种。 4 、在命令行编译程序时,其中使用命令qmake – project 的作用是: _生成*.pro工程文件_;将.ui 文件编译成.h 文件时,使用了_Qt Designer编译工具。 5、使QTimer 对象开始计时的方法是__start()____。 6、信号与槽机制中,发射信号的关键字是_emit____________。 7、创建一个窗体对象后,要想显示该窗体,需要调用对象的__________方法,要想隐藏该窗体需要调用对象的_________方法。 8、使QTimer 对象开始计时的方法是______________。 9、设置QLabel 对象显示文本内容的方法是__setText()_。 10 、Qt 中的常用标准对话框有_颜色对话框__ 、_消息对话框_ 、 _输入对话框__。 11、Qt 中常用的布局管理器有_垂直布局管理器_、_水平……和_垂直布局管理器等。 12、Qt 的按钮控件是哪个类_QPushButton,标签是哪个类QLabel_,文本控件是哪个类QTextEdit_。 13、当某个事件出现时,通过发送_______信号___,可以将与之相关的_槽函数激活,即执行槽函数代码。 14、使用元对象编译器,将自定义类声明放在头文件中,并在第一句加上宏 __Q_Object________ ,使用qmake 工具生成_makefile_ ,则makefile 会自动调用__moc_工具对自定义信号和槽进行处理。 15、_用show()______显示的对话框是无模式对话框。用_exec()______显示的对话框是模式对话 1、什么是Qt?有哪些优点? Qt是一种跨平台的C++图形用户界面应用程序开发框架 优点: 1.优良的跨平台特性;面向对象;丰富的api; 2.支持2D/3D 图形渲染,支持OpenGL 3.大量的开发文档 2、Qt中有哪些方式对窗体上的控件进行布局管理 绝对位置定位,手工布局,布局管理器 3、Qt有哪些特点? 轻型,占用资源少,高性能,高可靠性,便于移植,可配置

QT实现漂亮的数据加载窗口-附源码

在用户等待数据加载的时候,一个好看的数据加载界面是非常重要的。刚好最近工作可能也要实现一个好看的数据加载等待界面,于是乎在互联网上阅览一番之后没找到比较好看的样子,因此决定手动实现一个。 QT提供丰富的图形绘制接口,可以绘制出非常炫酷的图形,可以说只要提供一个好看的设计图,用QT都能实现出来。 话不多说,下面把上图的实现思路介绍一下,最后附上源码 1、由于QT窗口默认是矩形的,而且不透明,因此为了实现圆形背景,需要先设置窗口背 景为纯透明,然后再绘制这个圆形。 2、从图中可以看出,背景圆形的颜色是从中心到边沿渐变由浅到深的,这里使用QT提供 渐变类QRadialGradient可以实现。 3、中间的固定文字和进度文字没什么可说的,关联具体的加载工作更新即可 4、上图中最麻烦的可能就是边沿的动态旋转条了,两条旋转条其实是对称的,实现了一边 就能轻易实现另一边。旋转条也是渐变的,从头到尾透明度逐渐增加,颜色也逐渐变化,这个可以通过QT提供的QConicalGradient类来实现。 5、而旋转效果就是通过定时器定时旋转坐标系来实现,这种方式是实现旋转效果的最简单 方式。

下面附上源码: LoadingProgressDialog.h #ifndef LOADINGPROGRESSDIALOG_H #define LOADINGPROGRESSDIALOG_H #include class QTimer; class LoadingProgressDialog:public QDialog { Q_OBJECT public: LoadingProgressDialog(QWidget*parent=0); ~LoadingProgressDialog(); void paintEvent(QPaintEvent*event); void mousePressEvent(QMouseEvent*event); void mouseDoubleClickEvent(QMouseEvent*event); public slots: void updateAngle(); void updateProgress(); private: int percent; QString description; QStringList descriptionList; int descriptionIndex; qreal angle;//旋转角度 bool isCursor;//光标形式或者圆弧形式 QTimer*angleTimer; QTimer*percentTimer; QTimer*descriptionTimer; };

Qt界面布局管理详解

本节再以一个稍微复杂的例子来讲解设计 GUI 的常见功能,包括界面设计时布局的管理,以及程序里如何访问界面组件。 实例程序功能 创建一个 Widget Application 项目 samp2_2,在创建窗体时选择基类QDialog,生成的类命名为 QWDialog,并选择生成窗体。 如此新建的项目 samp2_2 有一个界面文件 qwdialog.ui,一个头文件qwdialog.h 和源程序文件 qwdialog.cpp。此外,还有项目文件 samp2_2.pro 和主程序文件 main.cpp。 qwdialog.ui 界面文件设计时界面如图 1 所示。程序的主要功能是对中间一个文本框的文字字体样式和颜色进行设置。 图 1 实例程序 samp2_2 设计时界面 在界面设计时,对需要访问的组件修改其 objectName,如各个按钮、需要读取输入的编辑框、需要显示结果的标签等,以便在程序里区分。对于不需要程序访问的组件则无需修改其 objectName,如用于界面上组件分组的 GroupBox、Frame、布局等,让 UI 设计器自动命名即可。 对图 1 中几个主要组件的命名、属性设置见表 2。

对于界面组件的属性设置,需要注意以下几点。 1.objectName 是窗体上创建的组件的实例名称,界面上的每个组件需要有一个唯 一的 objectName,程序里访问界面组件时都是通过其 objectName 进行访问,自动生成的槽函数名称里也有 objectName。所以,组件的 objectName 需要在设计程序之前设置好,设置好之后一般不要再改动。若设计程序之后再改动objectName,涉及的代码需要相应的改动。 2.窗体的 objectName 就是窗体的类名称,在 UI 设计器里不要修改窗体的 objectName,窗体的实例名称需要在使用窗体的代码里去定义。 界面组件布局 Qt 的界面设计使用了布局(Layout)功能。所谓布局,就是界面上组件的排列方式,使用布局可以使组件有规则地分布,并且随着窗体大小变化自动地调整大小和相对位置。布局管理是 GUI 设计的必备技巧,下面逐步讲解如何实现图 1 所示的界面设计。 界面组件的层次关系 为了将界面上的各个组件的分布设计得更加美观,经常使用一些容器类,如 QgoupBox、QtabWidget、QFrame 等。 例如,将 3 个 CheckBox 组件放置在一个 GroupBox 组件里,该GroupBox 组件就是这 3 个 CheckBox 的容器,移动这个 GroupBox 就会同时移动其中的 3 个 CheckBox。

一步一步做QT界面设计

一步一步做QT设计 安徽中兴继远信息技术有限公司

目录 第一章界面设计器 (3) 第1节界面设计效果 (3) 第2节界面设计 (3) 第3节添加槽与连接 (7) 第4节建立工程 (8) 第二章QMAINWINDOW (11) 第三章QDOCKWINDOW (11) 第四章菜单栏 (15) 第五章QT在UNIX中的安装和使用 (16) 第1节QT在UNIX中的安装 (16) 第2节QT在UNIX中的使用 (17)

网络QT教程:https://www.doczj.com/doc/a89830150.html,/doc/https://www.doczj.com/doc/a89830150.html,/qt/ 第一章界面设计器 第1节界面设计效果 在这一张我们介绍用QT的设计器来设计一个程序界面,其效果图如(图1.1)所示 图1.1.1 程序界面设计效果 程序最上面是标准的“标题栏”和“菜单栏”。在左边是一个DockWindow 里面有一个QlistView控件,用来存放表名称。在右边是一个QtabWidget 控件和和一个QlistView竖直排列。 当用户在左边点击一个表名之后,右边就显示相应的表的内容。如用户点击厂站表“Factory Name”后在右边就显示各厂站的id号,名称。 第2节界面设计 在windows上安装完QT3.2.1非商业版后,点击“开始”-“程序”-“Qt3.2.1 non-commercial”-“Qt Designer”打开如图所示的设计器

图1.2.1QT设计器界面 在这里我们选择MainWindow点击“OK”按钮。打开如(图1.2.2)所示。 图1.2.2 标准菜单选择器 我们采用默认设置。点击“Next”进入下一步。打开如(图 1.2.3)所示的界面。

Qt Style Sheet实践(二):组合框QComboBox的定制

导读 组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分。在许多既需要用户选择、又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求。如我们经常使用的聊天软件QQ登录框,便是一个很好的应用例子: 显然,用户既可以自己手动输入新的QQ号码,也可以在列表框中选择历史输入记录。对于提高用户体验是一个不错的手段。这篇博文重点讲述如何用QSS对组合框进行定制。 基本自定义 组合框的使用非常简单,为了加快叙述速度,我们直接在Qt Designer中拖一个QComboBox控件放到主窗口中。此时,我们什么都不用做就有了一个简单的组合框,如下: 但很显然,我们得添加一个文字,否则QComboBox不会显示任何内容。这样出现的组合框样式很普通:一个文本加一个带箭头号的按钮就完了。既然主题是用QSS来定制组合框,那么我们第一件事就是新建一个.qss文件并添加到资源文件中进行编译。.qss文件的内容初步编写如下: QComboBox { border: 1px solid gray; border-radius: 3px; padding: 1px2px1px2px; # 针对于组合框中的文本内容 min-width: 9em; # 组合框的最小宽度 }

我们给组合框3个像素的圆角,边框1个像素宽并将颜色设置为灰色。看看效果: 文本框部分似乎还不错,但是右边的按钮外观实在是太丑了,和整体风格不搭。我们继续美化一下按钮。按钮是QComboBox的一个子组件,用::drop-down指代。编写如下QSS代码: QComboBox::drop-down { subcontrol-origin: padding; subcontrol-position: top right; width: 20px; border-left-width: 1px; border-left-color: darkgray; border-left-style: solid; /* just a single line */ border-top-right-radius: 3px; /* same radius as the QComboBox */ border-bottom-right-radius: 3px; } QComboBox::down-arrow { image: url(:/misc/down_arrow_2); } 可以看到,我们分别将按钮右上角和右下角设置了3个像素的圆角,这是因为我们前面给组合框的整体边框设置了圆角。如果不给按钮设置圆角,那么按钮的棱角将会遮挡住整体边框的圆角效果。另外,我们改变了按钮上的箭头图标。:: down-arrow也是一个子组件,我们用image属性替换了系统默认的图标。对比一下: 嗯,整体风格上看起来协调些了。当然了,在::drop-down子组件的定制中,我们将subcontrol-position属性设置成了top, right。这样按钮就位于最右边了。如果希望将按钮置于最左边显然也很简单。只需要将subcontrol-p osition设置为top, left,然后改变一下QComboBox的padding值就可以达到目的了。我们再拉出下拉框看看: 有什么问题呢?显然,下拉框中的选项高度太小了,看起来挺别扭的。那么如何对下拉框进行定制呢?我们有个很好的模仿对象:

Qt界面美工实例

Qt StyleSheet样式表实例 在涉及到Qt 美工的时候首先需要掌握CSS 级联样式表。 下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计。自定义的前台背景与后台背景的颜色: 如果需要一个文本编辑器的背景变为黄色,下面是代码行: qApp->setStyleSheet("QLineEdit { background-color: yellow }"); 针对一个对话框的内容中使用QLineEdit以及QLineEdit的子类的背景都变成黄色,下面是代码: myDialog ->setStyleSheet("QLineEdit { background-color: yellow }"); 如果只需要制定一个QLineEdit的内容,将使用QObject::setObjectName() 下面是一个实例: myDialog->setStyleSheet("QLineEdit#nameEdit { background-color: yellow }"); 同时也可以针对每一个指定的部件做直接的类型设置,下面是一个实例: https://www.doczj.com/doc/a89830150.html,Edit->setStyleSheet("background-color: yellow"); 为了做一个鲜明的对比,将要为文本设置合适的颜色。 nameEdit->setStyleSheet("color: blue; background-color: yellow"); 当然最好的办法还有针对选择的文本来进行设置,下面设置了一个选择文本的类型属性:nameEdit->setStyleSheet("color: blue;" "background-color: yellow;" "selection-color: yellow;" "selection-background-color: blue;"); 在有一些情况下,不需要用户参与,而有软件设计人员来自己制定样式,即使这些是有违审美角度。下面就从应用程序开发角度来设计样式。 *[mandatoryField="true"] { background-color: yellow } 上面的意思是一些强制的区域是需要用Qt 的属性管理来强制设置成为黄色的背景。 这样一些强制的部件,将需要通过函数来设置当前的属性已经被强制设置,下面是实现的代码:

QT界面美化之flag应用

QT界面美化之flag应用2015-02-11 第一版微信jpzy01整理 - 设置程序界面风格 在main函数中 QApplication::setStyle("windows"); QApplication::setStyle("windowsxp"); QApplication::setStyle("motif"); QApplication::setStyle("cde"); QApplication::setStyle("macintosh"); QApplication::setStyle("plastique"); 风格可以是"windows", "motif", "cde", "plastique", "windowsxp", "macintosh" - 设置窗口样式 setWindowFlags(flags) flags: Qt::WindowContextHelpButtonHint Qt::FramelessWindowHint // 去掉标题栏 Qt::CustomizeWindowHint Qt::WindowTitleHint // 只有标题栏,没有窗口控制按钮 Qt::WindowSystemMenuHint Qt::WindowCloseButtonHint Qt::WindowMaximizeButtonHint Qt::WindowMinimizeButtonHint Qt::SubWindow Qt::Desktop Qt::SplashScreen Qt::ToolTip Qt::Tool // 没有标题栏图标、没有任何按钮,只有标题 Qt::CustomizeWindowHint | Qt::WindowTitleHint 用法一: clientMainWindow::clientMainWindow(QWidget *parent) : QMainWindow(parent, Qt::WindowCloseButtonHint) { ... }

相关主题
相关文档 最新文档