QDialog
今天讲一个我们这个系列的第一篇就提到的东西:QDialog。
相信经过前几篇的学习,大家应该是能够通过QT助手来对QDialog有个初步的了解。
我们就直接来测试一下。
#include "Zhetu.h"
#include <qdebug.h>
#include <QPushButton>
#include <QDialog>
Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
this->setFixedSize(650, 400);
QPushButton* button = new QPushButton("test", this);
button->move(100, 100);
connect(button, &QPushButton::clicked, [&]() {
QDialog* d = new QDialog();
d->show();
});
}
Zhetu::~Zhetu()
{}
就是我们先设置一个按钮,这个按钮按下,我们就生成一个QDialog。
我们先记着这个写法,在new这个QDialog的时候,它的构造函数里我们是空着的,也就是没有给它指定父亲,效果如上图。当QDialog出现的时候,实际上是多开了个窗口。
如果我们给它指定父亲为主界面的时候,效果如下图,没有多开一个窗口,这个是两种写法比较显著的区别。
然后我们发现,按一次按钮会生成一个QDialog,而我们可以一直按,如果我们只让它生成一个,那该怎么实现呢,我们从软件层面入手的话就可以在外面设置一个变量,用这个变量来控制只能生成一个。我们也可以从这个组件本身入手。
我们上面代码用的是show函数来让它显示出来,我们也有其他方法,例如上面的exec。
使用exec来代替show之后,我们发现,一旦QDialog出现之后,我们就只能操作QDialog了,如果我们点击了主界面的话,则会发出提示音并且QDialog闪动,这就是在告诉我们,我们此时只能操作QDialog,直到我们关闭QDialog之后才恢复正常。
QDialog相关的事件函数也很多,这边就演示一下第一个closeEvent,其他的函数通过名字相信大家也能猜出是干什么的。
#include "Zhetu.h"
#include <qdebug.h>
#include <QPushButton>
#include <QDialog>
void QDialog::closeEvent(QCloseEvent* e) {
qDebug() << "Bye world";
}
Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
this->setFixedSize(650, 400);
QPushButton* button = new QPushButton("test", this);
button->move(100, 100);
connect(button, &QPushButton::clicked, [&]() {
QDialog* d = new QDialog(this);
d->exec();
});
}
Zhetu::~Zhetu()
{}
消息对话框
那么关于QDialog的内容就讲这么多,接下来我们讲别的。
可以看到继承QDialog的组件有不少,我们讲一下QMessageBox,其他的相信大家经过这篇文章的学习之后也能通过QT助手看懂。
而QMessgaeBox中,我们主要讲一下它的静态函数。
我们从第三个开始看,从第三个开始的函数的返回值类型变得很长。
可以看得出来是枚举类型,也可以看的出来这些函数的返回值是int类型的。
我们从第一个开始测试。
#include "Zhetu.h"
#include <qdebug.h>
#include <QPushButton>
#include <QDialog>
#include <QMessageBox>
Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
this->setFixedSize(650, 400);
QPushButton* button = new QPushButton("test", this);
button->move(100, 100);
connect(button, &QPushButton::clicked, [&]() {
int res = QMessageBox::critical(this, "title", "text");
qDebug() << res;
});
}
Zhetu::~Zhetu()
{}
看的出来这会弹出一个警告的提示框,我们点击默认提供的按钮“OK”之后返回值为1024,这也符合上面图片中的0x0400。
我上面测试代码中给构造函数传了三个参数,第一个是this,也就是指定它的父亲为主界面,第二个字符串设置提示框的标题,第三个字符串设置提示框里的内容。
但是实际上它的构造函数中可以有五个参数,我们再一个个试试。
看不懂英文的话我们就简单翻译一下。
我们再多加一个参数试一下。
根据QT助手提供的构造函数中的参数类型,我们先随便塞一个Close进去,可以发现,原本“OK”的按键变成了“Close”,也就是说我们可以更改提示框中的按键的内容,但是不是随意更改的,因为传参的类型需要为QMessageBox::StandarButtons类型。
我们再传入第五个参数试试。
发现按钮多了一个,并且排在前面的是第五个参数,当我们按下回车的时候,默认选择的也是第五个参数。
因此我们稍微总结一下,提示框可以有两个按钮(但是默认是一个,另一个我们是需要传入参数指定的),按下不同按钮的时候,提示框会关闭,并且根据我们按下的按钮返回不同的数值,我们可以根据不同数值去执行不同的逻辑。
其实剩下其他函数也差不多,只是提示框的类型不一样,那么下面就简单地演示一下,详细的内容都可以像上面那样通过查询QT助手去搞懂。
当然了,以上的静态函数是很方便我们使用的,因为不需要自己去new一个类出来,但是缺点也很明显,那就是提供我们修改的空间不大,并且也无法重载事件函数,虽然基本上够我们使用,但是有些情况下我们还需要自己DIY的,那么我们就需要new一个QMessageBox出来了。
我们构造一个出来QMessageBox出来,默认就有一个“OK”按钮,我们使用exec让它显示出来,也会有个返回值回来。
那么我们应该如何DIY呢,我们再看看QMessageBox的函数,找到set开头的。
相信大家都能看得懂,我就不一个个介绍了,下面我就总体的展示一下作为这篇文章的结尾。
#include "Zhetu.h"
#include <qdebug.h>
#include <QPushButton>
#include <QDialog>
#include <QMessageBox>
Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
this->setFixedSize(650, 400);
QPushButton* button = new QPushButton("test", this);
button->move(100, 100);
connect(button, &QPushButton::clicked, [&]() {
QMessageBox* m = new QMessageBox(this);
m->setWindowTitle("title");
m->setText("text");
m->setIcon(QMessageBox::Critical);
m->setStandardButtons(QMessageBox::Yes); //设置一开始就有的按钮内容
m->addButton(QMessageBox::Cancel); //添加一个按钮
m->addButton(QMessageBox::Save);
m->setDefaultButton(QMessageBox::Yes); //设置默认按钮(需要先有)
int res = m->exec();
qDebug() << res;
});
}
Zhetu::~Zhetu()
{}