第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)。
python3+PyQt5+QtDesigner实现堆叠窗口部件
python3+PyQt5+QtDesigner实现堆叠窗⼝部件本⽂是对《Python Qt GUI快速编程》的第9章的堆叠窗⼝例⼦Vehicle Rental⽤Python3+PyQt5+Qt Designer进⾏改写。
第⼀部分⽆借⽤Qt Designer,完全⽤代码实现。
第⼆部分则借⽤Qt Designer,快速实现。
第⼀部分:import sysfrom PyQt5.QtCore import (Qt)from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog,QDialogButtonBox, QFrame, QGridLayout, QHBoxLayout, QLabel,QSpinBox, QStackedWidget, QVBoxLayout, QWidget)class VehicleRentalDlg(QDialog):def __init__(self, parent=None):super(VehicleRentalDlg, self).__init__(parent)vehicleLabel = QLabel("&Vehicle Type:")self.vehicleComboBox = QComboBox()vehicleLabel.setBuddy(self.vehicleComboBox)self.vehicleComboBox.addItems(["Car", "Van"])colorLabel = QLabel("Co&lor:")self.colorComboBox = QComboBox()colorLabel.setBuddy(self.colorComboBox)self.colorComboBox.addItems(["Black", "Blue", "Green", "Red","Silver", "White", "Yellow"])seatsLabel = QLabel("&Seats:")self.seatsSpinBox = QSpinBox()seatsLabel.setBuddy(self.seatsSpinBox)self.seatsSpinBox.setRange(2, 12)self.seatsSpinBox.setValue(4)self.seatsSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)weightLabel = QLabel("&Weight:")self.weightSpinBox = QSpinBox()weightLabel.setBuddy(self.weightSpinBox)self.weightSpinBox.setRange(1, 8)self.weightSpinBox.setValue(1)self.weightSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)self.weightSpinBox.setSuffix(" tons")volumeLabel = QLabel("Volu&me")self.volumeSpinBox = QSpinBox()volumeLabel.setBuddy(self.volumeSpinBox)self.volumeSpinBox.setRange(4, 22)self.volumeSpinBox.setValue(10)self.volumeSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)self.volumeSpinBox.setSuffix(" cu m")mileageLabel = QLabel("Max. Mileage")eageLabel = QLabel("1000 miles")eageLabel.setAlignment(Qt.AlignRight|Qt.AlignVCenter)eageLabel.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel)self.stackedWidget = QStackedWidget()carWidget = QWidget()carLayout = QGridLayout()carLayout.addWidget(colorLabel, 0, 0)carLayout.addWidget(self.colorComboBox, 0, 1)carLayout.addWidget(seatsLabel, 1, 0)carLayout.addWidget(self.seatsSpinBox, 1, 1)carWidget.setLayout(carLayout)self.stackedWidget.addWidget(carWidget)vanWidget = QWidget()vanLayout = QGridLayout()vanLayout.addWidget(weightLabel, 0, 0)vanLayout.addWidget(self.weightSpinBox, 0, 1)vanLayout.addWidget(volumeLabel, 1, 0)vanLayout.addWidget(self.volumeSpinBox, 1, 1)vanWidget.setLayout(vanLayout)self.stackedWidget.addWidget(vanWidget)topLayout = QHBoxLayout()topLayout.addWidget(vehicleLabel)topLayout.addWidget(self.vehicleComboBox)bottomLayout = QHBoxLayout()bottomLayout.addWidget(mileageLabel)bottomLayout.addWidget(eageLabel)layout = QVBoxLayout()layout.addLayout(topLayout)layout.addWidget(self.stackedWidget)layout.addLayout(bottomLayout)layout.addWidget(self.buttonBox)self.setLayout(layout)self.buttonBox.accepted.connect(self.accept)self.buttonBox.rejected.connect(self.reject)self.vehicleComboBox.currentIndexChanged[str].connect(self.setWidgetStack)self.weightSpinBox.valueChanged[int].connect(self.weightChanged)self.setWindowTitle("Vehicle Rental")def setWidgetStack(self, text):if text == "Car":self.stackedWidget.setCurrentIndex(0)eageLabel.setText("1000 miles")else:self.stackedWidget.setCurrentIndex(1)self.weightChanged(self.weightSpinBox.value())def weightChanged(self, amount):eageLabel.setText("{0} miles".format(8000 / amount))app = QApplication(sys.argv)form = VehicleRentalDlg()form.show()app.exec_()第⼆部分:/home/yrd/eric_workspace/Vehicle/Ui_vehiclerentaldlg.py# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '/home/yrd/eric_workspace/Vehicle/vehiclerentaldlg.ui'## Created by: PyQt5 UI code generator 5.7## WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_VehicleRentalDlg(object):def setupUi(self, VehicleRentalDlg):VehicleRentalDlg.setObjectName("VehicleRentalDlg")VehicleRentalDlg.resize(206, 246)self.gridlayout = QtWidgets.QGridLayout(VehicleRentalDlg)self.gridlayout.setContentsMargins(9, 9, 9, 9)self.gridlayout.setSpacing(6)self.gridlayout.setObjectName("gridlayout")self.buttonBox = QtWidgets.QDialogButtonBox(VehicleRentalDlg)self.buttonBox.setOrientation(QtCore.Qt.Horizontal)self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)self.buttonBox.setObjectName("buttonBox")self.gridlayout.addWidget(self.buttonBox, 4, 0, 1, 1)spacerItem = QtWidgets.QSpacerItem(188, 16, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.gridlayout.addItem(spacerItem, 3, 0, 1, 1)self.hboxlayout = QtWidgets.QHBoxLayout()self.hboxlayout.setContentsMargins(0, 0, 0, 0)self.hboxlayout.setSpacing(6)self.hboxlayout.setObjectName("hboxlayout")bel_6 = QtWidgets.QLabel(VehicleRentalDlg)bel_6.setObjectName("label_6")self.hboxlayout.addWidget(bel_6)eageLabel = QtWidgets.QLabel(VehicleRentalDlg)eageLabel.setFrameShape(QtWidgets.QFrame.StyledPanel)eageLabel.setFrameShadow(QtWidgets.QFrame.Sunken)eageLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) eageLabel.setObjectName("mileageLabel")self.hboxlayout.addWidget(eageLabel)self.gridlayout.addLayout(self.hboxlayout, 2, 0, 1, 1)self.stackedWidget = QtWidgets.QStackedWidget(VehicleRentalDlg)self.stackedWidget.setObjectName("stackedWidget")self.page_2 = QtWidgets.QWidget()self.page_2.setObjectName("page_2")self.gridlayout1 = QtWidgets.QGridLayout(self.page_2)self.gridlayout1.setContentsMargins(9, 9, 9, 9)self.gridlayout1.setSpacing(6)self.gridlayout1.setObjectName("gridlayout1")self.colorComboBox = QtWidgets.QComboBox(self.page_2)self.colorComboBox.setObjectName("colorComboBox")self.colorComboBox.addItem("")self.colorComboBox.addItem("")self.colorComboBox.addItem("")self.colorComboBox.addItem("")self.colorComboBox.addItem("")self.colorComboBox.addItem("")self.colorComboBox.addItem("")self.gridlayout1.addWidget(self.colorComboBox, 0, 1, 1, 1)bel_4 = QtWidgets.QLabel(self.page_2)bel_4.setObjectName("label_4")self.gridlayout1.addWidget(bel_4, 0, 0, 1, 1)bel_5 = QtWidgets.QLabel(self.page_2)bel_5.setObjectName("label_5")self.gridlayout1.addWidget(bel_5, 1, 0, 1, 1)self.seatsSpinBox = QtWidgets.QSpinBox(self.page_2)self.seatsSpinBox.setAlignment(QtCore.Qt.AlignRight)self.seatsSpinBox.setMinimum(2)self.seatsSpinBox.setMaximum(12)self.seatsSpinBox.setProperty("value", 4)self.seatsSpinBox.setObjectName("seatsSpinBox")self.gridlayout1.addWidget(self.seatsSpinBox, 1, 1, 1, 1)self.stackedWidget.addWidget(self.page_2)self.page = QtWidgets.QWidget()self.page.setObjectName("page")self.gridlayout2 = QtWidgets.QGridLayout(self.page)self.gridlayout2.setContentsMargins(9, 9, 9, 9)self.gridlayout2.setSpacing(6)self.gridlayout2.setObjectName("gridlayout2")self.weightSpinBox = QtWidgets.QSpinBox(self.page)self.weightSpinBox.setAlignment(QtCore.Qt.AlignRight)self.weightSpinBox.setMinimum(1)self.weightSpinBox.setMaximum(8)self.weightSpinBox.setObjectName("weightSpinBox")self.gridlayout2.addWidget(self.weightSpinBox, 0, 1, 1, 1)bel_3 = QtWidgets.QLabel(self.page)bel_3.setObjectName("label_3")self.gridlayout2.addWidget(bel_3, 1, 0, 1, 1)bel_2 = QtWidgets.QLabel(self.page)bel_2.setObjectName("label_2")self.gridlayout2.addWidget(bel_2, 0, 0, 1, 1)self.volumeSpinBox = QtWidgets.QSpinBox(self.page)self.volumeSpinBox.setAlignment(QtCore.Qt.AlignRight)self.volumeSpinBox.setMinimum(4)self.volumeSpinBox.setMaximum(22)self.volumeSpinBox.setProperty("value", 10)self.volumeSpinBox.setObjectName("volumeSpinBox")self.gridlayout2.addWidget(self.volumeSpinBox, 1, 1, 1, 1)self.stackedWidget.addWidget(self.page)self.gridlayout.addWidget(self.stackedWidget, 1, 0, 1, 1)self.hboxlayout1 = QtWidgets.QHBoxLayout()self.hboxlayout1.setContentsMargins(0, 0, 0, 0)self.hboxlayout1.setSpacing(6)self.hboxlayout1.setObjectName("hboxlayout1")bel = QtWidgets.QLabel(VehicleRentalDlg)bel.setObjectName("label")self.hboxlayout1.addWidget(bel)self.vehicleComboBox = QtWidgets.QComboBox(VehicleRentalDlg)self.vehicleComboBox.setObjectName("vehicleComboBox")self.vehicleComboBox.addItem("")self.vehicleComboBox.addItem("")self.hboxlayout1.addWidget(self.vehicleComboBox)self.gridlayout.addLayout(self.hboxlayout1, 0, 0, 1, 1)bel_4.setBuddy(self.colorComboBox)bel_5.setBuddy(self.seatsSpinBox)bel_3.setBuddy(self.volumeSpinBox)bel_2.setBuddy(self.seatsSpinBox)bel.setBuddy(self.vehicleComboBox)self.retranslateUi(VehicleRentalDlg)self.stackedWidget.setCurrentIndex(0)self.vehicleComboBox.currentIndexChanged['int'].connect(self.stackedWidget.setCurrentIndex) self.buttonBox.accepted.connect(VehicleRentalDlg.accept)self.buttonBox.rejected.connect(VehicleRentalDlg.reject)QtCore.QMetaObject.connectSlotsByName(VehicleRentalDlg)def retranslateUi(self, VehicleRentalDlg):_translate = QtCore.QCoreApplication.translateVehicleRentalDlg.setWindowTitle(_translate("VehicleRentalDlg", "Vehicle Rental"))bel_6.setText(_translate("VehicleRentalDlg", "Max. Mileage:"))eageLabel.setText(_translate("VehicleRentalDlg", "1000 miles"))self.colorComboBox.setItemText(0, _translate("VehicleRentalDlg", "Black"))self.colorComboBox.setItemText(1, _translate("VehicleRentalDlg", "Blue"))self.colorComboBox.setItemText(2, _translate("VehicleRentalDlg", "Green"))self.colorComboBox.setItemText(3, _translate("VehicleRentalDlg", "Red"))self.colorComboBox.setItemText(4, _translate("VehicleRentalDlg", "Silver"))self.colorComboBox.setItemText(5, _translate("VehicleRentalDlg", "White"))self.colorComboBox.setItemText(6, _translate("VehicleRentalDlg", "Yellow"))bel_4.setText(_translate("VehicleRentalDlg", "Co&lor:"))bel_5.setText(_translate("VehicleRentalDlg", "&Seats:"))self.weightSpinBox.setSuffix(_translate("VehicleRentalDlg", " tons"))bel_3.setText(_translate("VehicleRentalDlg", "Volu&me:"))bel_2.setText(_translate("VehicleRentalDlg", "&Weight:"))self.volumeSpinBox.setSuffix(_translate("VehicleRentalDlg", " cu m"))bel.setText(_translate("VehicleRentalDlg", "&Vehicle Type:"))self.vehicleComboBox.setItemText(0, _translate("VehicleRentalDlg", "Car"))self.vehicleComboBox.setItemText(1, _translate("VehicleRentalDlg", "Van"))/home/yrd/eric_workspace/Vehicle/vehiclerentaldlg.py# -*- coding: utf-8 -*-"""Module implementing VehicleRentalDlg."""import sysfrom PyQt5.QtCore import pyqtSlotfrom PyQt5.QtWidgets import QDialog,QApplicationfrom Ui_vehiclerentaldlg import Ui_VehicleRentalDlgclass VehicleRentalDlg(QDialog, Ui_VehicleRentalDlg):"""Class documentation goes here."""def __init__(self, parent=None):"""Constructor@param parent reference to the parent widget@type QWidget"""super(VehicleRentalDlg, self).__init__(parent)self.setupUi(self)self.vehicleComboBox.setFocus()@pyqtSlot(int)def on_weightSpinBox_valueChanged(self, amount):eageLabel.setText("{0} miles".format(8000 / amount))@pyqtSlot(str)def on_vehicleComboBox_currentIndexChanged(self, text):if text == "Car":eageLabel.setText("1000 miles")else:self.on_weightSpinBox_valueChanged(self.weightSpinBox.value())if __name__ == "__main__":app = QApplication(sys.argv)form = VehicleRentalDlg()form.show()app.exec_()运⾏结果:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
qt里setlayout用法
Qt里setLayout用法在Qt中,setLayout是一种常用的布局管理器函数,用于设置窗口或窗口部件的布局。
布局管理器是一种用于自动调整窗口部件位置和大小的工具,可以使界面更加灵活和适应不同的窗口尺寸。
本文将详细介绍Qt中setLayout的用法,包括创建布局管理器、设置布局管理器、添加和删除窗口部件等操作。
1. 创建布局管理器在使用setLayout之前,我们首先需要创建一个布局管理器。
Qt提供了几种常用的布局管理器,包括垂直布局(QVBoxLayout)、水平布局(QHBoxLayout)、网格布局(QGridLayout)等。
1.1 垂直布局(QVBoxLayout)垂直布局将窗口部件按照垂直方向依次排列,可以使用QVBoxLayout类来创建垂直布局管理器。
QVBoxLayout *layout = new QVBoxLayout();1.2 水平布局(QHBoxLayout)水平布局将窗口部件按照水平方向依次排列,可以使用QHBoxLayout类来创建水平布局管理器。
QHBoxLayout *layout = new QHBoxLayout();1.3 网格布局(QGridLayout)网格布局将窗口部件按照网格形式排列,可以使用QGridLayout类来创建网格布局管理器。
QGridLayout *layout = new QGridLayout();1.4 其他布局管理器除了上述常用的布局管理器,Qt还提供了一些其他的布局管理器,如堆叠布局(QStackedLayout)、表单布局(QFormLayout)等,根据实际需求选择合适的布局管理器。
2. 设置布局管理器创建布局管理器后,我们需要将其设置给窗口或窗口部件,以便布局管理器能够对窗口部件进行布局。
QWidget *widget = new QWidget();widget->setLayout(layout);在上述代码中,我们创建了一个QWidget对象widget,并通过setLayout函数将布局管理器layout设置给widget。
qt5 教程
qt5 教程Qt5是一个流行的开源C++框架,用于构建跨平台的图形用户界面(GUI)应用程序。
本教程介绍了Qt5的基础知识和常见的使用技巧。
第一部分:引言和安装在本部分中,我们将介绍Qt5的背景和优势,并详细讲解如何在不同操作系统上安装Qt5。
第二部分:Qt5的基本概念本部分将介绍Qt5的核心概念,如QObject、QWidget和信号与槽等。
我们将讲解如何创建、显示和管理基本的UI界面元素。
第三部分:Qt5的布局管理在本部分中,我们将学习Qt5的布局管理器,包括水平布局、垂直布局和网格布局等。
我们还将讲解如何使用布局管理器来自动调整UI界面元素的大小和位置。
第四部分:Qt5的常用控件本部分将介绍Qt5的常见控件,如按钮、标签、文本框和列表框等。
我们将讲解如何创建和使用这些控件,并且介绍它们的常用属性和方法。
第五部分:Qt5的绘图和动画在本部分中,我们将学习Qt5的绘图和动画功能。
我们将介绍如何使用Qt绘制基本图形和进行颜色填充,以及如何创建简单的动画效果。
第六部分:Qt5的文件和数据处理本部分将介绍Qt5的文件和数据处理功能。
我们将讲解如何读写文件、解析和生成JSON、XML和CSV等格式的数据。
第七部分:Qt5的网络编程在本部分中,我们将学习Qt5的网络编程功能。
我们将介绍如何创建基于TCP和UDP的网络连接,并实现简单的客户端和服务器程序。
请注意,本教程是以简要的方式介绍Qt5的基础知识和常见的使用技巧,以供初学者参考。
如果您对Qt5需要更深入的理解或拥有更高级的使用需求,建议参考官方文档或更专业的教程。
Qt的几个常用部件
Qt的几个常用部件(1)QLabel(头文件qlabel.h)QLabel部件是一个简单的窗口,能够显示一个字符串。
QLabel 类有三个被定义的构造函数,如下所示QLabel(QWidget *parent,const char *name=0,WFlags f=0)QLabel(constQString&text,QWidget *parent,const char *name=0,WFlags f=0)QLabel(QWidget *buddy,constQString&text,QWidget *parent,const char*name=0,WFlags f=0)例如我们经常见到的QLabel *label=new QLabel("Hello",0);用到的就是第二个构造函数,意思是创建一个QLabel部件,并显示Hello,而且父部件为0,也就是它被当作顶层的窗口。
如果我们要修改label所显示的文字,我们可以用label->setText("HelloQT!");这样字符串“Hello”就被改成了“Hello QT”了,如果你想清除字符串的话,可以用label->setT ext("");这样它就什么也不显示了。
QLabel默认的动作时是以垂直方向中心对齐的方式显示字符串,以左边为基准。
如果要改变它的对称方式,可以用label->setAlignment(AlignVCenter|AlignHCenter)调用setAlignment()函数使得文本在水平和垂直方向上都位于中心位置。
QLabel还可以调用setGeometry()函数来改变标签部件在QApplication窗口中的位置、高度和宽度。
其中setGeometry()的原型是setGeometry(intx,inty,intw,int h) ,x,y是QLabel部件在QApplication的坐标,w和h是宽度和高度(2)QPushButton(头文件qpushbutton.h)QPushButton定义了一个按钮。
qt基本组件2
Qt的组件
Qt- C++图形用户界面库
5.2 标签
5.2.1 QLabel
5.2.1.1 QLabel的描述
QLabel窗口部件提供了显示文本或者图象,没有提供用户的交互 功能。因为标签的外观可以通过各种各样的方式来配置,而且它可以为 指定焦点记忆键到另外的窗体上。
QLabel提供了以下内容类型: 设置无格式的文本:可以通过setText()函数来设置,它将接收到 Qstring传递给它的文本信息。 设置大量的文本:可以通过setText()函数来设置,它将接收到 QString传递给它的大量信息。
该按钮是矩形的,并且通常显示一个文本标签来描述它的操作。标 签中有下划线的字母(在此它的前面用“&”标明)表明快捷键,比如: QPushButton *pushbutton = new QPushButton("&Help", this); 这个实例中快捷键是Alt+H,并且文本标签将被显示为Help。
Qt的组件
Qt- C++图形用户界面库
5.1.3.2 复选按钮的成员
QCheckBox::QCheckBox ( QWidget * parent = 0 ) 构造一个参数为parent的复选按钮,但是该按钮不显示文本信息。 parent参数传递给QAbstractButton构造函数。 QCheckBox::QCheckBox ( const QString & text, QWidget * parent =0) 构造一个参数为parent和text的复选按钮。parent参数传递给 QAbstractButton构造函数。
注意:您可以传递一个QPixmap作为一个图标(感谢由C++提供的隐含类 型转换)。
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 窗口初始化设置参数
qt 窗口初始化设置参数[qt 窗口初始化设置参数]Qt是一种跨平台的C++应用程序开发框架,可用于开发图形用户界面(GUI)应用程序。
在Qt中,窗口是用户界面的一部分,通过设置参数,我们可以定制窗口的外观和行为。
本文将一步一步回答如何设置Qt窗口的初始化参数,以帮助开发者更好地了解和掌握Qt窗口的使用。
第1步:创建一个Qt窗口项目首先,我们需要创建一个Qt窗口项目以进行实践。
在Qt Creator 中,选择“文件”->“新建文件或项目”,然后选择“Qt Widgets 应用程序”,并点击“下一步”。
在“项目名称”中输入一个名称,并选择项目的存储位置。
然后,点击“下一步”,直到点击“完成”开始创建项目。
第2步:设置窗口的标题在Qt中,我们可以使用`setWindowTitle()`函数来设置窗口的标题。
在主窗口的构造函数中,找到以下代码行:cpp主窗口类::主窗口类(QWidget *parent): QMainWindow(parent){...}在该代码块中的注释行之后,添加以下代码来设置窗口的标题:cppsetWindowTitle("My Window"); 设置窗口标题使用您希望的标题替换“My Window”。
第3步:设置窗口的初始大小在Qt中,我们可以使用`resize()`函数来设置窗口的初始大小。
在主窗口的构造函数中,找到以下代码行:cpp主窗口类::主窗口类(QWidget *parent): QMainWindow(parent){...}在该代码块中的注释行之后,添加以下代码来设置窗口的初始大小:cppresize(800, 600); 设置窗口初始大小使用您希望的宽度和高度替换“800”和“600”。
第4步:设置窗口的图标在Qt中,我们可以使用`setWindowIcon()`函数来设置窗口的图标。
在主窗口的构造函数中,找到以下代码行:cpp主窗口类::主窗口类(QWidget *parent): QMainWindow(parent){...}在该代码块中的注释行之后,添加以下代码来设置窗口的图标:cppsetWindowIcon(QIcon(":/icon/icon.ico")); 设置窗口图标请确保将“: / icon / icon.ico”替换为您自己的图标文件路径。
Qt入门教程_详细讲解版
行为
当你运行它的时候,你就会看到一个被单一按钮充满的小窗口,在它上面你可以 读到著名的词:Hellow World!
int main( int argc, char **argv )
{
main()函数是程序的入口。几乎在使用 Qt 的所有情况下,main()只需要在把控制 转交给 Qt 库之前执行一些初始化,然后 Qt 库通过事件来向程序告知用户的行为。 argc 是命令行变量的数量,argv 是命令行变量的数组。这是一个 C/C++特征。它 不是 Qt 专有的,无论如何 Qt 需要处理这些变量(请看下面)。
Qt 教程一 —— 第一章:Hello, World!
第一个程序是一个简单的 Hello World 例子。它只包含你建立和运行 Qt 应用程序 所需要的最少的代码。上面的图片是这个程序的快照。
/**************************************************************** ** ** Qt 教程一 - 2 ** ****************************************************************/
#include <qapplication.h> #include <qpushbutton.h> #include <qfont.h>
int main( int argc, char **argv ) {
qt活动窗口和焦点窗口,按键获取
如果一个窗口部件处理键盘事件,你必须使键盘焦点生效。这通常在窗口部件的构造函数中完成。例如,QLineEdit的构造函数调用setFocusPolicy(QWidget::StrongFocus)。
(2)void QWidget::setFocus() [虚槽]
函数setFocus()把键盘输入焦点赋给这个窗口部件(或者它的焦点代理)。
2、焦点策略及操作函数
键盘焦点的策略及操作函数说明如下:
(1)焦点策略属性变量
focusPolicy 焦点策略属性变量保存的是窗口部件接收键盘焦点的策略。如果窗口部件通过tab来接收键盘焦点,这个策略就是QWidget::TabFocus;如果窗口部件通过点击来接收键盘焦点,这个策略就是QWidget::ClickFocus;如果窗口部件上述两种方式都使用,是 QWidget::StrongFocus;并且如果它不接收焦点(QWidget的默认值),是QWidget::NoFocus。
(3)void QWidget::setFocusProxy(QWidget * w) [虚]
函数setFocusProxy设置这个窗口部件的焦点代理为窗口部件w。如果w为0,这个函数重置这个窗口部件没有焦点代理。
一些窗口部件,比如QComboBox,能够"拥有焦点",但创建一个子窗口部件来实际处理这个焦点。例如,QComboBox创建了一个QLineEdit来处理焦点。
这些移动机制的每个都是不同的,并且不同类型的窗口部件只能接收它们中的一些方式的焦点。下面我们将按次序介绍它们。
(1)Tab或者Shift+Tab.
按Tab键是到目前为止用键盘移动焦点的最通用的方法。有时在输入数据的应用程序中Enter键和Tab键的作用是一样的。我们暂时忽略这一点。
qwidget 底层原理
qwidget 底层原理
QWidget 是Qt 框架中的一个重要类,它充当了所有用户界面对象的基类。
QWidget 底层原理主要包括以下几个方面:
1. 事件处理:QWidget 负责接收来自窗口系统的鼠标、键盘和其他事件。
这些事件通过QEvent 子类实例传递给特定的事件处理函数,由小部件进行处理。
2. 绘制:QWidget 使用双缓冲绘制,因此不需要在paintEvent() 中编写双缓冲代码来避免闪烁。
QWidget 及其子类会根据需要自行处理绘制的细节。
3. 层次结构:QWidget 树状层次结构使得父窗口可以控制子窗口的显示和位置。
窗口部件按Z 轴顺序排列,子窗口可以被父窗口或其他先前的窗口部件覆盖。
4. 尺寸管理:在实现新窗口部件时,通常需要重新实现sizeHint() 函数,以提供合理的默认大小。
同时,使用setSizePolicy() 函数设置正确的大小策略,以便布局管理系统可以更好地处理窗口部件的大小。
5. 窗口部件标记:QWidget 构造函数接受两个或三个标准参数,包
括父窗口部件、窗口部件名称和窗口标记。
窗口标记用于设置特定于窗口部件的行为,如是否具有窗口系统框架等。
6. 内容提供:开发者需要为QWidget 提供具体内容。
根据实际需求,可以实现自定义的QWidget 子类,以满足不同场景的需求。
总之,QWidget 底层原理主要包括事件处理、绘制、层次结构、尺寸管理、窗口部件标记和内容提供等方面。
通过这些机制,QWidget 能够实现丰富的用户界面功能。
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知道完成。
qt5 frame designer使用
qt5 frame designer使用Qt5 是一种强大的跨平台应用程序开发框架,可以用于构建高性能、可扩展和用户友好的图形用户界面。
Qt5 提供了一个名为Qt Designer的工具,用于创建和设计用户界面。
Qt Designer是一个可视化设计环境,可以帮助开发人员在不编写代码的情况下创建和布局用户界面。
本文将详细介绍Qt5 Frame Designer的使用方法。
Frame是一种QWidget的子类,可以作为用户界面的容器或组件使用,它可以嵌套其他小部件,方便地布局和管理用户界面的结构。
第一步:启动Qt Designer要开始使用Qt Designer,首先需要启动它。
在Qt Creator中,选择“文件”菜单下的“新建文件或项目”,然后选择“用户界面”类别下的“界面文件”选项。
然后选择一个位置和文件名来保存您的界面文件。
第二步:添加Frame小部件在Qt Designer的界面上,您可以看到一个工具箱,其中包含各种可用的小部件。
要添加一个Frame小部件,可以在工具箱中找到并拖动它到主窗口的中心区域。
第三步:设置Frame属性选择添加的Frame小部件,然后在属性编辑器中可以设置其属性。
例如,您可以更改Frame的背景颜色、大小和位置,并添加必要的布局和边框效果。
您还可以设置Frame的名称和其他属性,以便在代码中引用它。
第四步:嵌入其他小部件作为一个容器小部件,Frame可以嵌入其他小部件。
您可以在工具箱中选择其他小部件,并在Frame中放置它们。
通过拖动和调整大小,您可以在Frame中布置其他小部件,以构建所需的用户界面。
第五步:设计Frame布局通过使用Qt Designer提供的布局管理器,可以方便地设计和管理Frame 中的小部件布局。
例如,您可以选择“垂直布局”或“水平布局”来自动布局Frame中的小部件。
您还可以手动调整小部件的大小和位置来实现更精确的布局。
第六步:设计Frame样式在Qt Designer中,您还可以定制Frame的外观和样式。
- 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(); }