第六章QDialog(Layouts)
- 模态对话框:在弹出对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到对话框关闭
- 非模态对话框:又叫无模式对话框,即弹出非模态对话框时,用户仍然可以对其他窗口进行操作
- 半模态对话框:介于模态和非模态之间,会阻塞窗口的响应,但不影响后续代码的执行
#include <QDialog>
QDialog dialog;
// dialog.exec(); // 模态显示
// dialog.show(); // 非模态显示
dialog.open(); // 半模态显示
qDebug() << "dialog";
QDialogButtonBox
#include <QDialogButtonBox>
#include <QPushButton>
auto dialogbox = new QDialogButtonBox; // 如果不添加对象,show不显示窗口
dialogbox->addButton(QDialogButtonBox::Ok);
dialogbox->addButton("取消", QDialogButtonBox::RejectRole);
dialogbox->addButton(new QPushButton("保存"), QDialogButtonBox::AcceptRole);
dialogbox->setOrientation(Qt::Vertical); // 按钮修改为垂直排列(默认是水平排列的)
QObject::connect(dialogbox, &QDialogButtonBox::accepted, [=] {
qInfo() << "接受";
dialogbox->close(); }); // 点击ok和保存都会触发接受,因为都是AcceptRole
QObject::connect(dialogbox, &QDialogButtonBox::rejected, [] { qInfo() << "拒绝"; });
//设置窗口关闭时自动释放对象
dialogbox->setAttribute(Qt::WA_DeleteOnClose); // 使用这个属性,对象必须是堆区自己new的,否则会引发中断
dialogbox->show();
QMessageBox
#include <QMessageBox>
QMessageBox* msgBox = new QMessageBox;
msgBox->setText("今天天气不错");
msgBox->setIcon(QMessageBox::Warning); // 显示一个系统图标
msgBox->exec(); // 模态对话框,这个点了之后才能执行后面的
// 上面的功能也可以通过静态函数做到
QMessageBox::about(nullptr, "静态", "今天天气不错"); // 效果如上,都是模态的
QMessageBox::aboutQt(nullptr); // 显示一个Qt的说明对话框
QMessageBox::information(nullptr, "模态", "又是一个好天气"); // 返回一个QMessageBox::StandardButton
auto sBtn = QMessageBox::information(nullptr, "sbtn", "standard", QMessageBox::Cancel, QMessageBox::Yes);
if (sBtn == QMessageBox::Cancel)
qInfo() << "取消"; // 点击cancel就会触发这个信号
else
qInfo() << "继续";
QMessageBox::critical(nullptr, "", "好天气+1"); // 错误对话框
QMessageBox::warning(nullptr, "", "坏天气"); // 警告对话框
QMessageBox::question(nullptr, "", "今天天气怎么样?"); // 问题对话框
QFileDialog
#include <QFileDialog>
QFileDialog* flDialog = new QFileDialog(nullptr, "标题", "./"); // 打开当前文件对话框,没有过滤器的时候显示AllFile(*)
flDialog->exec();
// 也可以用静态函数
QString path = QFileDialog::getExistingDirectory(nullptr, "", "./"); // 返回选择文件的路径
if (!path.isEmpty())
qInfo() << path; // 当选中文件,点击选择文件夹时触发信号,点取消,就返回空
// 也可以获取文件路径
QString filePath = QFileDialog::getOpenFileName(nullptr, "", "./", "image(*.jpg *.png);;file(*.c *.cpp)");
qInfo() << filePath;
// 获取多个文件
auto files = QFileDialog::getOpenFileNames(nullptr, "", "./", "image(*.jpg *.png);;file(*.c *.cpp)"); // 返回Qstringlist
for (auto f : files) {
qInfo() << f;
}
// 返回用户保存的文件,文件名可以不存在,不存在则创建
auto savefile = QFileDialog::getSaveFileName();
qInfo() << savefile;
QFontDialog
- 通过QFont设置字体
#include <QPainter>
#include <QWidget>
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget* parent = nullptr);
~Widget();
protected:
void paintEvent(QPaintEvent* event) override;
};
Widget::Widget(QWidget* parent)
: QWidget(parent)
{
QFont font;
font.setBold(true); // 粗体
font.setPointSize(30); // 设置点的大小
font.setItalic(true); // 斜体
font.setFamily("Arial");
setFont(font); // 设置当前字体
}
void Widget::paintEvent(QPaintEvent* event)
{
QPainter p(this);
p.drawText(50, 50, "这就是我选择的字体");
}
- 也可以通过对话框设置字体
#include <QFontDialog>
//构造函数设置字体
auto fontDialog = new QFontDialog(font, this);
// fontDialog->show();
// 或者静态成员设置字体
bool ok;
// QFont f = QFontDialog::getFont(&ok, font, this, "fontDialog静态成员");
QFont f = QFontDialog::getFont(&ok, this); // 同上
if (ok) {
qInfo() << "选择了新字体:" << f.family();
this->setFont(f);
} else {
qInfo() << "没选择,当前字体:" << font.family();
this->setFont(font);
}
QColorDialog
// QColor类颜色定义
#include <QColor>
#include <QColorDialog>
QColor c(20, 34, 50);
QColor c1("#3e99da");
QColor c2;
c2.setRed(10);
c2.setGreen(20); // 设置红绿蓝,不设置就是0
qInfo() << c << c1 << c2;
// 颜色对话框,构造函数
auto colorDialog = new QColorDialog(c, this);
colorDialog->show();
connect(colorDialog, &QColorDialog::colorSelected, [](QColor c) {
qInfo() << c;
});
// 静态函数
auto newcolor = QColorDialog::getColor(c, this, "选择颜色");
qInfo() << newcolor; // 按OK,返回新的颜色,按取消,返回无效颜色
QInpuDialog
#include <QInputDialog>
// 输入浮点数对话框
bool ok;
double dnum = QInputDialog::getDouble(this, "提示", "请输入浮点数", 100, 0, 999999, 2, &ok, Qt::Dialog, 10);
// 初始值100,范围0到999999,2位小数,步长为10(上下箭头一次调整10)
if (ok)
qInfo() << "新的值" << dnum;
else
qInfo() << "还是原来的值" << dnum;
// 输入整数对话框
int inum = QInputDialog::getInt(this, "提示", "请输入整数");
qInfo() << inum;
QStringList strlist;
strlist << "学生"
<< "萝莉"
<< "御姐";
qInfo() << QInputDialog::getItem(this, "提示", "Item", strlist);
qInfo() << QInputDialog::getText(this, "", ""); // 输入文本,按OK,返回输入的文本
QProgressDialog
// 进度对话框
#include <QProgressDialog>
#include <QTimer>
auto pgDialog = new QProgressDialog("正在发送", "取消发送", 0, 100, this);
pgDialog->show();
// 设置信号和槽
QTimer* timer = new QTimer(this);
timer->start(100);
connect(timer, &QTimer::timeout, [=] {
static int a = 0;
pgDialog->setValue(a++);
});
connect(pgDialog, &QProgressDialog::canceled, timer, &QTimer::stop);
QErrorMessage
#include <QErrorMessage>
#include <QPushButton>
auto errMsg = new QErrorMessage(this);
auto btn = new QPushButton(this);
connect(btn, &QPushButton::clicked, [=] {
errMsg->showMessage("来了,老弟");
errMsg->showMessage("是的", "1");
errMsg->showMessage("是的", "2"); // 设置type,就可以和上面的区别开来,取消勾选任意一个,不影响另一个的出现
errMsg->showMessage("不是");
errMsg->showMessage("不是"); // 如果不设置,和上面是同一个,取消勾选任意一个,下次2个都不会出现
});
文章来源地址https://www.toymoban.com/news/detail-851554.html
文章来源:https://www.toymoban.com/news/detail-851554.html
到了这里,关于Qt第六章对话框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!