Qt 5.14.2 学习记录 —— 십팔 对话框

发布于:2025-02-10 ⋅ 阅读:(66) ⋅ 点赞:(0)


1、Qt对话框

Qt的对话框用QDialog类来表示,可以自定义一些类来实现自定义对话框,但需要继承自QDialog。

常用对话框:

QFiledialog(文件对话框)、QColorDialog(颜色对话框)
QFontDialog(字体对话框)、QInputDialog (输入对话框)、 QMessageBox(消息框)

创建一个Dialog项目

在这里插入图片描述
在这里插入图片描述

主窗口通常不作为对话框,而是再创建对话框。

写一个常见的对话框逻辑

// 放一个按钮到界面中
void Dialog::on_pushButton_clicked()
{
    QDialog* dialog = new QDialog(this);
    dialog->setWindowTitle("标题");
    dialog->resize(400, 700);
    dialog->show();
}

因为继承自QWidget,所以用的方法也都一样。不过现在的代码肯定不行,因为每次点击都要new一个,这是一个漏洞。如果在槽函数里最后加上delete dialog,那么点击按钮后,对话框就会出现一下就消失。应该在用户点击对话框叉号的时候再关闭对话框,这方面是Qt内部自动做好的。

2、自定义对话框

1、代码方式

新建一个mainwindow项目,在这个项目下创建C++类

在这里插入图片描述
在这里插入图片描述

// dialog.h
#include <QWidget>
#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget* parent);

    void handle();
};

// dialog.cpp
#include "dialog.h"
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

Dialog::Dialog(QWidget* parent) : QDialog(parent)
{
    // 创建控件加入到Dialog中
    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);

    QLabel* label = new QLabel("Label文本", this);
    QPushButton* button = new QPushButton("关闭", this);
    layout->addWidget(label);
    layout->addWidget(button);

    connect(button, &QPushButton::clicked, this, &Dialog::handle);
}

void Dialog::handle()
{
    this->close();
}

// mainwindow.cpp
#include "dialog.h"

void MainWindow::on_pushButton_clicked()
{
    // 括号可以加this, 加到对象树上, 这样dialog的h和cpp文件就写上对应的参数
    // 由于我们要手动释放, 所以不加this也可以
    Dialog* dialog = new Dialog(this);
    dialog->resize(300, 300);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

2、图形化方式

需要再创建一个ui文件

在这里插入图片描述
在这里插入图片描述

类名可以用自动生成的

在这里插入图片描述

对于对话框ui文件,放一个label和一个按钮

在这里插入图片描述

转到主窗口的按钮的槽函数,这样写

// mainwin.cpp
void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog(this);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

// dialog.cpp
void Dialog::on_pushButton_clicked()
{
    this->close();
}

3、模态对话框

模态的意思是当弹出该对话框时,必须完成对话框内的操作,关闭对话框后才能操作父窗口;非模态则反之,出现对话框后也能继续操作父窗口。

上面的代码都是非模态的,要写成模态,把show改成exec即可。

4、QMessageBox

消息对话框

创建一个MainWindow项目,在界面中放一个按钮

#include <QMessageBox>

void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);
    messageBox->setWindowTitle("对话框");
    messageBox->setText("对话框文本");
    messageBox->setIcon(QMessageBox::Warning);
    //messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);

    // 自定义按钮
    QPushButton* button = new QPushButton("自定义", messageBox);
    messageBox->addButton(button, QMessageBox::AcceptRole);
    // 此时槽函数用connect连接, 因为是用户自定义的按钮
    // 如果是用自带的按钮, 那么对于用户点击了哪个按钮
    // 在点击按钮, 对话框关闭后, 通过exec的返回值来知道哪个按钮被点击, 以此来执行对应的逻辑
    
    //messageBox->exec();
	int res = messageBox->exec();
	if (res == QMessageBox::Ok) qDebug() << "OK";
	else qDebug() << "Cancel";

    //delete messageBox;
    // 关闭时释放内存, 删除该对象
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
}

另一种更简单的自定义按钮方式

void MainWindow::on_pushButton_clicked()
{
    int res = QMessageBox::warning(this, "标题", "文本", QMessageBox::Ok | QMessageBox::Cancel);
    if (res == QMessageBox::Ok) qDebug() << "OK";
    else qDebug() << "Cancel";
}

5、QColorDialog

继承自QDialog类,内置了调色板。

1、QColorDialog (QWidget *parent = nullptr),创建对象的同时设置父对象
2、 QColorDialog(const QColor &initial, QWidget *parent = nullptr),创建对象的同时通过QColor对象设置默认颜色和父对象
3、 void setCurrentColor(const QColor &color),设置当前颜色对话框
4、 QColor currentColor() const,获取当前颜色对话框
5、 QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString
&title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()),打开颜色选择对话框,并返回一个QColor对象

MainWindow项目

#include <QColorDialog>

void MainWindow::on_pushButton_clicked()
{
    QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");
    qDebug() << color;

    // 修改窗口背景色
    QString style = "background-color: rgb(" + QString::number(color.red()) + ", " + QString::number(color.green()) + ", " + QString::number(color.blue()) + ");";
    
    // C语言风格
    //char style[1024] = {0};
    //sprintf(style, "background-color: rgb(%d, %d, %d);", color.red(), color.green(), color.blue());

    this->setStyleSheet(style);
}

6、QFileDialog

文件对话框

在这里插入图片描述
在这里插入图片描述

MainWindow项目中放两个按钮,一个保存文件,一个打开文件

#include <QFileDialog>

void MainWindow::on_pushButton_open_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this);
    qDebug() << filePath;
}

void MainWindow::on_pushButton_save_clicked()
{
    QString filePath = QFileDialog::getSaveFileName(this);
    qDebug() << filePath;
}

不过实际的打开和保存的逻辑并没有写,这里只是写了这两个方法的使用。

7、QFontDialog

字体对话框,用于选择字体

MainWindow项目

#include <QFontDialog>

void MainWindow::on_pushButton_clicked()
{
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    qDebug() << "ok = " << ok;
    qDebug() << font.family();
    qDebug() << font.pointSize();
    qDebug() << font.bold();
    qDebug() << font.italic();

    // 选择的字体应用到按钮上
    ui->pushButton->setFont(font);
}

8、QInputDialog

输入对话框

在这里插入图片描述
在这里插入图片描述

MainWindow项目

#include <QDebug>
#include <QInputDialog>

void MainWindow::on_pushButton_clicked()
{
    int res = QInputDialog::getInt(this, "整数输入对话框", "请输入一个整数: ");
    qDebug() << res;
}

void MainWindow::on_pushButton_2_clicked()
{
    double res = QInputDialog::getDouble(this, "浮点数输入对话框", "请输入一个浮点数: ");
    qDebug() << res;
}

void MainWindow::on_pushButton_3_clicked()
{
    QStringList items;
    items.push_back("111");
    items.push_back("222");
    items.push_back("333");
    QString item = QInputDialog::getItem(this, "条目输入对话框", "请输入条目: ", items);
    qDebug() << item;
}

结束。