第5讲 Qt窗口部件
Qt的第三章

(8) 向导对话框
略
5 其他窗口部件
(1) QFrame类族 包含QLabel、QLCDNumber、QSplitter、 QStackedWidget、QToolBox、 QAbstractScrollArea等。
公共属性: 通过设置FrameShape、FrameShadow、 LineWidth、MidLineWidth参数组合,形成 不同的效果。
(1)颜色对话框 QColorDialog 作用:用户可选择颜色并获得对应的值 方法一(使用类静态函数): QColor color=QColorDialog::getColor() 方法二(创建类对象):
QColorDialog dialog(Qt::red,this); dialog.setOption(QColorDialog::ShowAlphaChannel); dialog.exec(); QColor color = dialog.currentColor();
(2)文件对话框 QFileDialog 作用:用户选择文件或文件夹 打开文件: QFileDialog::getOpenFileName() 保存文件: QFileDialog::getSaveFileName()
(3)字体对话框 QFontDialog 作用:用户和选择字体 获得字体: QFont font = QFontDialog::getFont()
2)QCheckBox、QRadioButton、QGroupBox 常用函数: isChecked():判断是否被选中
注:一组单选框(RadioButton)常放置在 相同的GroupBox中,实现单选功能。
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; // 所得所在的独⽴窗⼝当然,如果窗⼝本⾝就是独⽴窗⼝,那么得到的就是⾃⼰。
Qt5种标准对话框及使用方法详解(Dialog)

Qt5种标准对话框及使⽤⽅法详解(Dialog )引⽤⾃: (侵删);QT 为应⽤程序设计提供了⼀些常⽤的标准对话框,如打开⽂件对话框、选择颜⾊对话框、信息提⽰和确认选择对话框、标准输⼊对话框等,⽤户⽆需再⾃⼰设计这些常⽤的对话框,这样可以减少程序设计⼯作量。
在前⾯⼏章的实例中,或多或少地⽤到了其中的⼀些对话框。
Qt 预定义的各标准对话框的类,及其主要静态函数的功能见表 1(由于输⼊参数⼀般较多,省略了函数的输⼊参数,只列出了函数的返回值类型)。
表 1 Qt 预定义标准对话框对话框常⽤静态函数名称函数功能QFileDialog⽂件对话框QString getOpenFileName() QStringList getOpenFileNames()QString getSaveFileName() QString getExistingDirectory()QUrl getOpenFileUrl()选择打开⼀个⽂件 选择打开多个⽂件 选择保存⼀个⽂件 选择⼀个⼰有的⽬录选择打幵⼀个⽂件,可选择远程⽹络⽂件QcolorDialog 颜⾊对话框QColor getColor()选择颜⾊QFontDialog 字体对话框QFont getFont()选择字体QinputDialog 输⼊对话框QString getText() int getlnt() double getDouble()QString getltem()QString getMultiLineText()输⼊单⾏⽂字 输⼊整数 输⼊浮点数从⼀个下拉列表框中选择输⼊ 输⼊多⾏字符串QMessageBox 消息框StandardButton information() StandardButton question()StandardButton waming() StandardButton critical() void about()void aboutQt()信息提⽰对话框 询问并获取是否确认的对话框 警告信息提⽰对话框 错误信息提⽰对话框 设置⾃定义信息的关于对话框 关于Qt 的对话框实例 samp6_1 演⽰使⽤这些对话框,程序运⾏界⾯如图 2 所⽰。
如何获得Qt窗口部件在主窗口中的位置

如何获得Qt窗⼝部件在主窗⼝中的位置⽤Qt Creator 设计程序时,最⽅便的就是ui设计器,可以很容易的得到想要的布局。
但是这样⾃动布局带来的后果是很难知道窗⼝中某⼀部件在主窗⼝中的相对位置。
在处理⼦窗⼝⿏标事件时变的很⿇烦。
主窗⼝有菜单、⼯具条等,想⽤⿏标绘图,
把⿏标轨迹映射到窗⼝部件上,这些问题。
其实最主要的是获得窗⼝部件的起始点相对主窗⼝的位置。
例如:在主窗⼝拖⼊⼀个QScrollArea 在其上放⼀个QLabel⽤来显⽰⿏标事件。
可以在ui对象结构上看到如下结构。
⼤家知道,我们可以⽤pos()来获得某⼀窗⼝部件的起始点相对其⽗的位置。
那么,看结构可知,要获得scrollArea_2在主窗⼝(MainWindow)中的相对位置
即为:ui->scrollArea_2->pos()+ui->centralWidget->pos()
所以想获得窗⼝ScrollArea_2在主窗⼝中的相对位置区域为:
labelrect = QRect(ui->scrollArea_2->pos()+ui->centralWidget->pos(),
ui->scrollArea_2->size());
那么判断⿏标是否在此控件上只需在⿏标事件响应函数内写如下语句即可:
if(labelrect.contains(event->pos())) {……}
现在你可以在任意复杂的ui结构中确定某⼀⼦部件的位置了,但⼀定要注意:
⽗关系,即当前部件于其⽗部件的相对位置,其⽗部件与上层部件的相对位置,
直到与主窗⼝的相对位置。
Qt 窗口部件适应窗口大小变化

widget跟随窗口调整
UI界面控件随窗口自适应变化大小
通过Qt Creator的设计模式实现,无需增加代码。
如下图,实现对最下层tableview大小跟随窗口调整:
1、界面空白处右击,选择布局-->栅格布局,这会使centralWidget布局设置为GridLayout。
然后界面中的部件会自动添加到栅格布局中,此时的部件会根据窗口大小自动调整大小。
2、但是部件的大小却不是我们希望的,极不协调,接下来就需要调整每个控件的设置。
调整控件Size的项目包括:sizePolicy、minimumSize、maxmumSize
比如将上面的第三行的lineEdit限制高度:
这样,在调整窗口大小的时候,lineEdit控件只能任意改变宽度,而高度则被限制在30个像素内。
(调整之后效果)
注意:
有些情况下设置了上面的操作步骤之后,但似乎没有起作用。
比如上面例子中第一行的几个空间,虽然设置了sizePolicy以及宽度、高度限制,但是还是随着界面改变。
这个时候,就需要添加 Spacer(看起来像弹簧的控件),之后就能解决问题了。
这是因为GridLayout布局的影响,他必须让布局之内的区域布满控件,而不能有空白,所以即使设置了大小限制,仍然会被拉伸。
添加Spacer就是为了填充多余的区域。
QT5自学教程 6

QT5自学教程(6)——布局,Tab和伙伴编辑在这一小节将介绍gui中的布局、tab和伙伴编辑。
和往常一样,我们依旧从介绍一些新的名词的含义开始。
1. Q : 什么是Layout?A:Layout就是所谓的布局。
布局的作用是管理窗口中的部件(比如前面接触过的按键、标签、编辑栏等),使得它们以一种美观合理的方式放置,虽然这不是必须的,但估计没有人会喜欢杂乱无章的窗口界面吧?!2. Q : Tab是什么?A:这里的Tab指的就是你键盘上的Tab键。
在一些窗口中按Tab键可以移动窗口中的焦点,比如从一个按键转移到另一个按键,或者从一个窗口转移到另一个窗口。
3. Q : 什么是buddies编辑?A:这里的buddies编辑指的就是伙伴编辑。
顾名思义,将两个不同部件关联在一起(前提是二者可以关联)之后,它们也就有了一个类似伙伴的关系,把窗口焦点移动到其中一个对象时会自动切换到它的伙伴对象。
例如,在我们下面这个例子中我们把label和line edit编辑为伙伴关系,当我们用把焦点移动到label上时,焦点会自动切换到line edit中。
在了解了布局、T ab和伙伴编辑的概念之后,我们将给出例子。
这个例子中不需要书写代码,所以这里也就不给出代码了(并不是说程序中没有代码,只不过在建立项目的时候,在向导的帮助下代码已经自动生成了)。
1. 建立一个gui项目(这里我们选择的QDialig是为了生成窗口的简洁,QDialog界面没有工具条、菜单和状态栏。
当然,你选择QMainWindow也绝对木有任何问题):2. 在界面中放置label、line edit、2个pushbutton和Horizontal spacer:3 将两个按键名字分别改为OK和Cancel,标签栏改为Name:。
在Edit Widget(编部件辑)模式下利用Lay Out Horizontally(水平布局)和Lay Out Vertically(垂直布局)对窗口中部件进行布局:4. 在Edit Signal\Slot(信号和槽编辑模式)下对两个按键进行编辑:(1)先对OK按键进行编辑(连接信号clicked()和槽accept()),按下OK键时接收内容并关闭窗口:(2)在对Cancel按键进行编辑(连接信号clicked()和槽close()),按下Cancel键时关闭窗口:5. 在Edit buddies(伙伴编辑)模式下,将label和line edit设置为伙伴:6. 在Edit Tab Order(T ab顺序)模式下,编辑按下Tab窗口中焦点的移动顺序(双击其中的数字可以改变其顺序):运行结果:小结在这一节介绍了布局、T ab和伙伴编辑的知识。
第5章 使用Qt基本GUI工具

如果你是自己采用编译源代码的方式安装 Qt,并且没有设置快捷方式的话,你可以从 命令行启动 Qt Designer。方法是进入到命令行方式,或者打开一个终端,进入你 Qt 安装 的目录,以笔者的 Red Flag 为例,进入 /usr/bin/目录,输入 ./designer-qt4,即可启 动 Qt Designer。
注意,不同的 Linux 发行版的菜单设置以及可执行文件命名可能会有所不同。
3.设置 Qt Designer
启动 Qt Designer 后,首先需要需要对它进行设置。
Qt Designer 支持两种界面排列形式:一种是多个顶极窗口并列分布形式;一种是与
Windows 上常见的 IDE 类似的单窗口(即多停靠窗锚接)形式。 多个顶级窗口的样子如图 5-2 所示,Qt Designer 的各个子窗口都作为独立的顶级窗口
名称与图标
功能
新建窗体
打开窗体 保存窗体
表 5-3 示出了编辑工具栏功能说明。
表 5-3 编辑工具栏功能说明
名称与图标
功能
撤销上一次操作
恢复操作
剪切 复制 粘贴 放到后面 放到前面 编辑窗口部件 编辑信号/槽 编辑伙伴 编辑标签顺序
表 5-4 示出了窗体布局工具栏功能说明。
表 5-4 窗体布局工具栏功能说明
表 5-5 窗口部件的属性设置
部件类别
objectName
text(WindowTitle)
Widget
myForm
布局示例
Label
label_name
姓名
Label
label_phone
电话
LineEdit
lineEdit_name
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)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1 基础窗口部件QWidget 3.2 对话框QDialog 3.3 其他窗口部件 3.4 小结
1
前一章中第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类 只有QMainWindow、QWidget和QDialog三种。 1)QMainWindow是带有菜单栏和工具栏的主窗口类, 2) QDialog是各种对话框的基类,而它们二者全部继承自QWidget。不仅如 此,其实所有的窗口部件都继承自QWidget。
14
这里使用了两种输出方式:
方式一:直接将字符串当做参数传给qDebug()函数,例如上面使用 这种方法输出x和y的值(不需要<QDebug>头文件)。
方式二:使用输出流的方式一次输出多个值,它们的类型可以不同, 例如程序中输出geometry和frame的值(需要<QDebug>头文件)。
说明:因为第一种方法很麻烦,所以经常使用的是第二种方法。
⑤单步跳出按钮。当进入函数内部时,跳出该函数,一般与 单步进入配合使用。
12
程序调试
从变量监视器中可以看到x、y、geometry和frame四个变量初始值都 是一个随机未知数。等到调试完成后,x、y的值均为0,这是它们的 默认值。而geometry的值为640x480+0+0,frame的值为639x479+0+0。 现在对这些值还不是很清楚,不过,为什么x、y的值会是0呢?我们 可能会想到,应该是窗口没有显示的原因,那么就更改代码,让窗口 先显示出来,再看这些值。在QWidget widget;一行代码后添加一行 代码: widget.show(); 注意:widget.show();不能加在widget.frameGeometry()之后,否则 值还是不变。
13
使用qDebug()函数
一在程序调试过程中也常用qDebug()函数,它可以将调试信息直接 输出到控制台,在Qt Creator中是输出到应用程序输出栏 。例如: QWidget widget; widget.resize(400, 300); // 设置窗口大小 widget.move(200, 100); // 设置窗口位置 widget.show(); int x = widget.x(); qDebug("x: %d", x); // 输出x的值 int y = widget.y(); qDebug("y: %d", y); QRect geometry = widget.geometry(); QRect frame = widget.frameGeometry(); qDebug() << "geometry: " << geometry << "frame: " << frame;
2
3.1 基础窗口部件QWidget
QWidget类是所有用户界面对象的基类,被称为基础窗口 部件。 QWidget继承自QObject类和QPaintDevice类。
QObject是所有支持Qt对象模型(Qt Object Model)的Qt 对象的基类 QPaintDevice是所有可以绘制的对象的基类。 本节内容:
16
3.2 对话框QDialog
本节先从对话框的介绍讲起,然后讲述两种不同类型的对 话框,再讲解一个有多个窗口组成并且窗口间可以相互切 换的程序,最后介绍一下Qt提供的几个标准对话框。
多窗口切换 模态和非模态对话框
标准对话框
17
多窗口切换
本节会涉及如下内容:
开始认识信号和槽 信号和槽的关联方式 从登陆对话框显示主界面的方法
4
在程序中定义了一个QWidget类对象的指针widget和两个QLabel对象指针 label与label2,其中label没有父窗口,而label2在widget中,widget是其父 窗口。
窗口部件(Widget)这里简称部件,是Qt中建立用户界面的主要元 素。像主窗口、对话框、标签、还有以后要介绍到的按钮、文本输入 框等都是窗口部件。 在Qt中,把没有嵌入到其他部件中的部件称为窗口,一般的,窗口都 有边框和标题栏,就像程序中的widget和label一样。 QMainWindow和大量的QDialog子类是最一般的窗口类型。窗口就 是没有父部件的部件,所以又称为顶级部件(top-level widget)。 与其相对的是非窗口部件,又称为子部件(child widget)。在Qt中 大部分部件被用作子部件,它们嵌入在别的窗口中,例如程序中的 label2。
10
调试模式
11
下面对调试模式的几个按钮和窗口进行简单介绍:
①继续按钮。程序在断点处停了下来,按下继续按钮后,程 序便会像正常运行一样,执行后面的代码,直到遇到下一 个断点,或者程序结束。 ②停止调试按钮。按下该按钮后结束调试。
③单步跳过按钮。直接执行本行代码,然后指向下一行代码。
④单步进入按钮。进入调用的函数内部。
QWidget *widget = new QWidget(0, Qt::Dialog | Qt::FramelessWindowHint); QLabel *label = new QLabel(0, Qt::SplashScreen | Qt::WindowStaysOnTopHint);
Qt::FramelessWindowHint用来产生一个没有边框的窗口 Qt::WindowStaysOnTopHint用来使该窗口停留在所有其它窗口上面。
6
例如:使用其中的Qt::Dialog和Qt::SplashScreen,更改程序中的新建对象 的那两行代码: QWidget *widget = new QWidget(0, Qt::Dialog); QLabel *label = new QLabel(0, Qt::SplashScreen); 更改后,窗口的样式发生了改变,一个是对话框类型,一个是欢迎窗口类型。 再次更改那两行代码:
9
下面在int x = widget.x(); 一行代码的标号前面点击鼠 标左键来设置断点。
所谓断点,就是程序运行到该行代码时会暂停下来,从而 可以查看一些信息,如变量值等。 要取消断点,只要在那个断点上再点击一下就可以了。设 置好断点后便可以按下F5或者左下角的调试按钮开始调试。 在程序构建时可能会出现警告,那是因为我们定义了变量 却没有使用造成的,不用管它。
窗口、子部件以及窗口类型
窗口几何布局
ቤተ መጻሕፍቲ ባይዱ
程序调试
3
窗口、子部件以及窗口类型
// 新建QWidget类对象,默认parent参数是0,所以它是个窗口 QWidget *widget = new QWidget(); // 设置窗口标题 widget->setWindowTitle(QObject::tr("我是widget")); // 新建QLabel对象,默认parent参数是0,所以它是个窗口 QLabel *label = new QLabel(); label->setWindowTitle(QObject::tr("我是label")); // 设置要显示的信息 label->setText(QObject::tr("label:我是个窗口")); // 改变部件大小,以便能显示出完整的内容 label->resize(180, 20); // label2指定了父窗口为widget,所以不是窗口 QLabel *label2 = new QLabel(widget); label2->setText(QObject::tr("label2:我不是独立窗口,只是widget的子部件")); label2->resize(250, 20); // 在屏幕上显示出来 label->show(); widget->show();
从输出信息中,可以清楚的看到几个函数的含义了。
15
qDebug()函数的第二种方法时还可以让输出自动换行。在return a.exec(); 一行代码前添加如下代码:
qDebug() << "pos:" << widget.pos() << endl << "rect:" << widget.rect() << endl << "size:" << widget.size() << endl << "width:" << widget.width() << endl<< "height:" << widget.height();
8
程序调试
下面在讲解窗口几何布局的几个函数的同时,讲解一下程序调试方面的内容。 将主函数内容更改如下: x()、y()分别返回部件的位置坐标的 #include <QApplication> x、y值,它们的默认值为0。 #include <QWidget> int main(int argc, char *argv[]) 而geometry()和frameGeometry()函 { 数分别返回没有边框和包含边框的窗 口框架矩形的值,其返回值是QRect QApplication a(argc, argv); 类型的,就是一个矩形,它的形式是 QWidget widget; (位置坐标,大小信息),也就是 int x = widget.x(); (x,y,宽,高)。 int y = widget.y(); QRect geometry = widget.geometry(); QRect frame = widget.frameGeometry(); return a.exec(); }