Qt学习之路 详解 下篇

移动开发
本文介绍的是创建对话框的例子,类中Q_OBJECT 宏表示要定义singnal和slot, signal和slot都是宏,Qt::CaseSensitivity 为枚举类型, 可取值Qt::CaseSensitive 和 Qt::CaseInsensitive, 表示匹配的灵敏度。

本文讲解的是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

// 当***个信号发出的时候, 就会发出第二个信号

  1. connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &))); 

可以移除连接

  1. 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

  1. buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); 

最常用的变形对话框为扩展对话框和多页面对话框.

相同的widget由于其内容不同, 则大小有可能不同, 如需设置相同大小则需要增加代码:

  1. primaryColumnCombo->setMinimumSize(secondaryColumnCombo->sizeHint()); 

// secondaryColumnCombo的内容为None, 比PrimaryColumnCombo的内容要多, 所以重新设置

#p#

多页面对话框

  1. QTabWidget --- 提供tab bar控制其内置的QStackedWidget   
  2. QListWidget 和 QStackedWidget 配合使用,  
  3. QListWidget的当前条目显示哪个QStackedWidget显示   
  4. QListWidget::currentRowChanged() 信号连至 QStackedWidget::setCurrentIndex() 槽   
  5. QTreeWidget 和 QStackedWidget 类似QListWidget  

动态对话框

是指用Qt Designer创建的.ui文件在运行期间创建的对话框. 而不是用.ui文件生成的C++代码创建的对话框.

我们可以在运行期间使用QUiLoader类加载ui文件

 

  1. view plaincopy to clipboardprint?QUiLoader uiLoader;     
  2. QFile file("sortdialog.ui");    
  3.  QWidget *sortDialog = uiLoader.load(&file);    
  4.  if (sortDialog) {       ...   }  QUiLoader uiLoader;  
  5. QFile file("sortdialog.ui");  
  6. QWidget *sortDialog = uiLoader.load(&file);  
  7. if (sortDialog) {  
  8.  ...  

我们可以使用QObject::findChild<T>()访问该form的子widget

  1. QComboBox *primaryColumnCombo =         
  2. sortDialog->findChild<QComboBox *>("primaryColumnCombo");     
  3. if (primaryColumnCombo) {       ...   }    
  4. QComboBox *primaryColumnCombo =  
  5.  sortDialog->findChild<QComboBox *>("primaryColumnCombo");  
  6. if (primaryColumnCombo) {  
  7.  ...  

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学习之路内容介绍完了,里面有很多我们要去学习的类,想要继续了解的话, 请参考:

          Qt 学习之路 上篇

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-17 10:19:11

Qt QWidge QSetting

2011-07-05 18:40:19

QT 信号 机制

2011-06-30 10:36:07

QT Graphics View

2011-06-27 10:28:45

Qt 网络 TCP

2011-06-24 16:50:06

QT 框架 OpenCV

2011-06-23 18:16:59

Qt Qtopia

2011-07-01 14:20:59

Qt 事件

2011-07-02 13:42:24

Qt 移植

2011-07-02 13:24:39

QT Linux

2011-07-05 13:32:45

QT Mysql 驱动

2010-05-18 13:53:34

Subversion插

2011-09-07 16:28:46

QT WidgetQWidget

2011-06-17 17:16:01

Qt Eclipse Linux

2011-06-17 13:39:47

Qt 文件

2011-09-01 16:01:25

Qt插件

2011-09-09 17:24:39

Qt Webkit模块

2011-06-27 13:49:43

Qt 数据库 QSqlQueryM

2011-06-30 16:08:05

Qt 字库 QPF

2018-04-20 12:12:18

数据分析可视化数据挖掘

2016-12-15 21:15:58

大数据
点赞
收藏

51CTO技术栈公众号