文章目录
- 1、Qt对话框
- 2、自定义对话框
- 1、代码方式
- 2、图形化方式
- 3、模态对话框
- 4、QMessageBox
- 5、QColorDialog
- 6、QFileDialog
- 7、QFontDialog
- 8、QInputDialog
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;
}
结束。