本文讲解的是Qt学习之路Chapter,以对话框为实例对象,请看内容。
创建对话框
程序一般用于设置程序的选项和选择.
类中Q_OBJECT 宏表示要定义singnal和slot, signal和slot都是宏,Qt::CaseSensitivity 为枚举类型, 可取值Qt::CaseSensitive 和 Qt::CaseInsensitive, 表示匹配的灵敏度。
Qt最重要的模块为 QtCore, QtGui, QtNetwork, QtOpenGL, QtScript, QtSql, QtSvg, QtXml,在比较大的程序中, 头文件中包含其他的大头文件, 不是合适的做法, 所以在头文件中不要include QtGui ,tr 函数可以用于转换该字符串至其他语言. label文本中的快捷键如&w,则按下alt+w则该label的buddy widget获得焦点.
addStretch 就像在该处增加了弹簧一样显示空白,slot和普通的C++成员函数相同, 可以是虚拟的, 可以被重载, 可以为公有, 保护或者私有函数. 可以直接调用该函数. 参数可以为任何类型. ***不同的就是当信号发出的时候就会自动调用该slot函数
signal和slot
一个signal可以连接多个slot
多个signal可以连接一个slot
一个signal可以连接另一个signal
// 当***个信号发出的时候, 就会发出第二个信号
- connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));
可以移除连接
- disconnect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
signal和slot必须含有相同的参数和次序. 如果signal的参数多于slot的参数数, 多余的参数则会抛弃.
在connect中, 参数不要写出名称, 只需写出类型即可.
signal和slot在QObject中实现, 不仅仅局限于GUI程序. 可以为任意QObject派生类所使用.
Qt的Meta-Object系统
该系统提供了两个关键服务: signals-slots 和 introspection(反省), introspection的功能是实现signals-slots的必要部分. 同时允许应用程序员在运行时期得到关于QObject派生类的"meta-information", 其包含该对象支持的signals和slots列表以及类名称. 该机制支持属性(Designer扩展的)和文本翻译(国际化), 并且为QtScript模块的基础, 可动态添加属性.
Qt通过提供分离的工具moc来实现该meta-object系统. 该机制的作用如下:
Q_OBJECT宏声明一些introspection函数, 这些函数必须在每个QObject派生类中实现: metaObject(), tr(), qt_metacall(),以及其他
moc工具生成Q_OBJECT所声明函数和所有信号的实现
QObject的成员函数如connect和disconncet使用这些introspection函数来完成工作. 注意避免signal和slot的无限循环问题,无论是手写代码还是用Qt designer, 创建对话框都拥有以下相同的基本步骤:
创建和初始化子widget
将子widget放入layout中
设置tab次序
建立signal-slot连接
实现对话框自定义slot
ui文件生成的c++文件里所生成的UI类, 声明了该form所有子widget和layout的成员变量. setupUi()函数初始化该form.
为了增加一些功能, 创建一个新类, 从QDialog和Ui::GoToCellDialog派生. 然后实现缺省的功能
Qt提供了三个内建的validator类: QIntValidator , QDoubleValidator , 和 QRegExpValidator
QRegExpValidator 可以设置其父对象, 这样就无需担心删除问题, 因为父对象的删除就必然要删除其子对象, 并在屏幕删除该对象
slot accept()函数将dialog的返回值设置为QDialog::Accepted()(等于1). reject则设置返回值为QDialog::Rejected()(等于0)
QLineEdit::hasAcceptableInput() 用验证器验证输入内容是否符合要求
QDialogButtonBox --- 一个widget, 含有指定的按钮并使用正确的方式显示, 拖动Button Box widget至form
- buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
最常用的变形对话框为扩展对话框和多页面对话框.
相同的widget由于其内容不同, 则大小有可能不同, 如需设置相同大小则需要增加代码:
- primaryColumnCombo->setMinimumSize(secondaryColumnCombo->sizeHint());
// secondaryColumnCombo的内容为None, 比PrimaryColumnCombo的内容要多, 所以重新设置
#p#
多页面对话框
- QTabWidget --- 提供tab bar控制其内置的QStackedWidget
- QListWidget 和 QStackedWidget 配合使用,
- QListWidget的当前条目显示哪个QStackedWidget显示
- QListWidget::currentRowChanged() 信号连至 QStackedWidget::setCurrentIndex() 槽
- QTreeWidget 和 QStackedWidget 类似QListWidget
动态对话框
是指用Qt Designer创建的.ui文件在运行期间创建的对话框. 而不是用.ui文件生成的C++代码创建的对话框.
我们可以在运行期间使用QUiLoader类加载ui文件
- view plaincopy to clipboardprint?QUiLoader uiLoader;
- QFile file("sortdialog.ui");
- QWidget *sortDialog = uiLoader.load(&file);
- if (sortDialog) { ... } QUiLoader uiLoader;
- QFile file("sortdialog.ui");
- QWidget *sortDialog = uiLoader.load(&file);
- if (sortDialog) {
- ...
- }
我们可以使用QObject::findChild<T>()访问该form的子widget
- QComboBox *primaryColumnCombo =
- sortDialog->findChild<QComboBox *>("primaryColumnCombo");
- if (primaryColumnCombo) { ... }
- QComboBox *primaryColumnCombo =
- sortDialog->findChild<QComboBox *>("primaryColumnCombo");
- if (primaryColumnCombo) {
- ...
- }
QUiLoader 位于特定的库里, 需要增加配置: CONFIG += uitools
内置的widget和对话框类
按钮: QPushButton, QToolButton, QCheckBox, QRadioButton
单页容器: QGroupBox, QFrame
多页容器: QTabWidget, QToolBox
显示条目: QListView, QTreeView, QTabView
显示: QLabel, QLCDNumber, QProgress, QTextBrowser
输入: QSpinBox, QDoubleSpinBox, QComboBox, QDateEdit, QTimeEdit, QDateTimeEdit, QScrollBar, QSlider, QTextEdit, QLineEdit, QDial
反馈对话框: QInputDialog, QProgressDialog, QMessageBox, QErrorMessage
颜色和字体对话框: QColorDialog, QFontDialog
文件和打印对话框: QPageSetupDialog, QFileDialog, QPrintDialog
滚动条QScrollBar的基类为 QAbstractScrollArea
Qt提供富文本(rich text), 支持多格式文本
QLabel支持纯文本, HTML, 图像
QTextBrowser为只读QTextEdit, 可支持带格式文本, 相对于QLabel, 可以用于显示大量的文本内容, 提供滚动条, 键盘和鼠标可以控制浏览.
QLineEditor支持validator, QTextEditor为QAbstractScrollArea的派生类, 可以输入大量的文本. 可以设置输入纯文本还是富文本(rich text)
QLineEditor和QTextEditor都和剪贴板相关联。
小结:Qt学习之路内容介绍完了,里面有很多我们要去学习的类,想要继续了解的话, 请参考: