Qt第六章对话框

第六章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个都不会出现
    });

相关推荐

  1. Qt对话框

    2024-04-14 12:38:03       21 阅读
  2. Linux

    2024-04-14 12:38:03       15 阅读
  3. Redies

    2024-04-14 12:38:03       18 阅读
  4. Redies

    2024-04-14 12:38:03       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-14 12:38:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-14 12:38:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-14 12:38:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-14 12:38:03       20 阅读

热门阅读

  1. SpringBoot 异步延时任务

    2024-04-14 12:38:03       38 阅读
  2. Asp.net 使用了 bootstrap,发布时样式丢失了

    2024-04-14 12:38:03       20 阅读
  3. Hadoop MapReduce解析

    2024-04-14 12:38:03       17 阅读
  4. ChatGPT指导下的学术写作:打造高质量论文

    2024-04-14 12:38:03       21 阅读
  5. Swift中的类

    2024-04-14 12:38:03       23 阅读
  6. python 有什么资格称为编程排行榜第一

    2024-04-14 12:38:03       54 阅读