Qt笔记总结
作者:hackett
微信公众号:加班猿
一、常用控件
按钮类
QPushButton
QtoolButton
QRadioButton
item
QListWidget
容器类
QStackWidget
QWidget
QFrame
编辑类
QComboBox
QLineEdit
QTextEdit
显示类
QLabel
setOpenExternalLinks()设置为true自动打开,false要打开链接需要捕捉linkActivated()信号//显示普通文本字符串
QLable *label = new QLable;
label->setText(“Hello, World!”);
//显示HTML格式的字符串
QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("
");
label ->setOpenExternalLinks(true);
QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("
");
// label->setOpenExternalLinks(true);
connect(label, &QLabel::linkActivated,
this, &MyWidget::slotOpenUrl);
//槽函数
void MyWidget::slotOpenUrl(const QString &link)
{
QDesktopServices::openUrl(QUrl(link));
}
QProcessBar
QMessageBox
二、信号与槽
信号和槽
信号槽,实际就是观察者模式。当某个事件发生之后,它就会发出一个信号(signal)将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。当信号发出时,被连接的槽函数会自动被回调。1、connect(sender, signal, receiver, slot);sender:发送信号的对象
signal:发送对象发出的信号
receiver:接收信号的对象
slot:接收对象在接收到信号之后所需要调用的函数
例如:/* &b1: 信号发出者,指针类型
* &QPushButton::pressed:处理的信号 (&发送者的类名::信号名字)
* this: 信号接收者
* &MainWidget::close:槽函数,信号处理函数 (&接收的类名::槽函数名字)
*/
connect(&b1, &QPushButton::pressed, this, &MainWidget::close);
自定义信号槽
自定义信号槽需要注意的事项发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;
槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
使用 emit 在恰当的位置发送信号;
使用QObject::connect()函数连接信号和槽。
任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数/* 自定义槽,普通函数的用法
* Qt5:任意的成员函数,普通全局函数,静态函数
* 槽函数需要和信号一致(参数,返回值)
* 由于信号都是没有返回值,所以,槽函数一定没有返回值
*/
connect(b2, &QPushButton::released, this, &MainWidget::mySlot);
Lambda表达式
C++11中的Lambda表达式用于定义并创建匿名的函数对象。
基本构成:[函数对象参数](操作符重载函数参数)mutable或exception ->返回值{函数体}
1、 函数对象参数:[ ] 标识一个**Lambda的开始**,这部分必须存在,**不能省略**。
* 空,没有任何函数对象参数
* =,**值传递方式**(作用范围:所有可见的局部变量以及所在类的this)
* &,**引用传递方式**(作用范围:所有可见的局部变量以及所在类的this)
* this,函数体内可以可以使用**Lambda所在类**中的成员变量
* a,把a按值进行传递(默认为const不可修改,可添加mutable修饰符修改)
* &b,把b按引用进行传递
* &,a,b,除a和b进行值传递,其他参数按引用进行传递
2、 操作符重载函数参数:
标识重载的()操作符的参数,没有参数时,这部分可以省略。
3、 可修改标示符:
mutable声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。
4、错误抛出标示符:
exception声明,这部分也可以省略。exception声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(int)
5、函数返回值:
->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
6、函数体:
{},标识函数的实现,这部分不能省略,但函数体可以为空。
三、Qt窗口系统
1、坐标体系
以左上角为原点,X向右增加,Y向下增加。
2、QWidget
所有窗口及窗口控件都是从QWidget直接或间接派生出来的。对象模型Qt创建对象的时候会提供一个Parent对象指针
在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)
QWidget是能够在屏幕上显示的一切组件的父类
QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件,也可以自己删除子对象,它们会自动从其父对象列表中删除。
当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的
任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。
3、QMainWindow
QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget)
菜单栏创建菜单栏,通过QMainWindow类的menubar() 函数获取主窗口菜单栏指针QMenuBar * menuBar() const
创建菜单,调用QMenu的成员函数addMenu() 来添加菜单QAction* addMenu(QMenu * menu)
QMenu* addMenu(const QString & title)
QMenu* addMenu(const QIcon & icon, const QString & title)
创建菜单项,调用QMenu的成员函数addAction() 来添加菜单项QAction* activeAction() const
QAction* addAction(const QString & text)
QAction* addAction(const QIcon & icon, const QString & text)
QAction* addAction(const QString & text, const QObject * receiver,
const char * member, const QKeySequence & shortcut = 0)
QAction* addAction(const QIcon & icon, const QString & text,
const QObject * receiver, const char * member,
const QKeySequence & shortcut = 0)
工具栏直接调用QMainWindow类的addToolBar() 函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。
插入属于工具条的动作,即在工具条上添加操作。通过QToolBar类的addAction() 函数添加。
工具条是一个可移动的窗口,它的停靠区域由QToolBar的allowAreas决定,包括:/*
Qt::LeftToolBarArea //停靠在左侧
Qt::RightToolBarArea //停靠在右侧
Qt::TopToolBarArea //停靠在顶部
Qt::BottomToolBarArea //停靠在底部
Qt::AllToolBarAreas //以上四个位置都可停靠
*/
/*使用setAllowedAreas()函数指定停靠区域*/
setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
/*使用setMoveable()函数设定工具栏的可移动性*/
setMoveable(false);//工具条不可移动, 只能停靠在初始化的位置上
```
状态栏派生自QWidget类,使用方法与QWidget类似,QStatusBar类常用成员函数://添加小部件
void addWidget(QWidget * widget, int stretch = 0)
//插入小部件
int insertWidget(int index, QWidget * widget, int stretch = 0)
//删除小部件
void removeWidget(QWidget * widget)
4、对话框QDialog
Qt 中使用QDialog类实现对话框。
对话框分为模态对话框和非模态对话框。模态对话框,就是会阻塞同一应用程序中其它窗口的输入。
模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。
与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。标准对话框
Qt 的内置对话框大致分为以下几类:QColorDialog: 选择颜色;
QFileDialog: 选择文件或者目录;
QFontDialog: 选择字体;
QInputDialog: 允许用户输入一个值,并将其值返回;