1. 窗口类的基类:QWidget
QWidget类是所有窗口类的父类(控件类是也属于窗口类), 并且QWidget类的父类的QObject, 也就意味着所有的窗口类对象只要指定了父对象, 都可以实现内存资源的自动回收。
1.1 设置父对象
// 构造函数
QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
// 公共成员函数
// 给当前窗口设置父对象
void QWidget::setParent(QWidget *parent);
void QWidget::setParent(QWidget *parent, Qt::WindowFlags f);
// 获取当前窗口的父对象, 没有父对象返回 nullptr
QWidget *QWidget::parentWidget() const;
1.2 窗口位置
//------------- 窗口位置 -------------
// 得到相对于当前窗口父窗口的几何信息, 边框也被计算在内
QRect QWidget::frameGeometry() const;
// 得到相对于当前窗口父窗口的几何信息, 不包括边框
const QRect &geometry() const;
// 设置当前窗口的几何信息(位置和尺寸信息), 不包括边框
void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);
// 移动窗口, 重新设置窗口的位置
void move(int x, int y);
void move(const QPoint &);
窗口位置设定和位置获取的测试代码如下:
// 获取当前窗口的位置信息
void MainWindow::on_positionBtn_clicked()
{
QRect rect = this->frameGeometry();
qDebug() << "左上角: " << rect.topLeft()
<< "右上角: " << rect.topRight()
<< "左下角: " << rect.bottomLeft()
<< "右下角: " << rect.bottomRight()
<< "宽度: " << rect.width()
<< "高度: " << rect.height();
}
// 重新设置当前窗口的位置以及宽度, 高度
void MainWindow::on_geometryBtn_clicked()
{
int x = 100 + rand() % 500;
int y = 100 + rand() % 500;
int width = this->width() + 10;
int height = this->height() + 10;
setGeometry(x, y, width, height);
}
// 通过 move() 方法移动窗口
void MainWindow::on_moveBtn_clicked()
{
QRect rect = this->frameGeometry();
move(rect.topLeft() + QPoint(10, 20));
}
1.3 窗口尺寸
//------------- 窗口尺寸 -------------
// 获取当前窗口的尺寸信息
QSize size() const
// 重新设置窗口的尺寸信息
void resize(int w, int h);
void resize(const QSize &);
// 获取当前窗口的最大尺寸信息
QSize maximumSize() const;
// 获取当前窗口的最小尺寸信息
QSize minimumSize() const;
// 设置当前窗口固定的尺寸信息
void QWidget::setFixedSize(const QSize &s);
void QWidget::setFixedSize(int w, int h);
// 设置当前窗口的最大尺寸信息
void setMaximumSize(const QSize &);
void setMaximumSize(int maxw, int maxh);
// 设置当前窗口的最小尺寸信息
void setMinimumSize(const QSize &);
void setMinimumSize(int minw, int minh);
// 获取当前窗口的高度
int height() const;
// 获取当前窗口的最小高度
int minimumHeight() const;
// 获取当前窗口的最大高度
int maximumHeight() const;
// 给窗口设置固定的高度
void QWidget::setFixedHeight(int h);
// 给窗口设置最大高度
void setMaximumHeight(int maxh);
// 给窗口设置最小高度
void setMinimumHeight(int minh);
// 获取当前窗口的宽度
int width() const;
// 获取当前窗口的最小宽度
int minimumWidth() const;
// 获取当前窗口的最大宽度
int maximumWidth() const;
// 给窗口设置固定宽度
void QWidget::setFixedWidth(int w);
// 给窗口设置最大宽度
void setMaximumWidth(int maxw);
// 给窗口设置最小宽度
void setMinimumWidth(int minw);
1.4 窗口标题和图标
//------------- 窗口图标 -------------
// 得到当前窗口的图标
QIcon windowIcon() const;
// 构造图标对象, 参数为图片的路径
QIcon::QIcon(const QString &fileName);
// 设置当前窗口的图标
void setWindowIcon(const QIcon &icon);
//------------- 窗口标题 -------------
// 得到当前窗口的标题
QString windowTitle() const;
// 设置当前窗口的标题
void setWindowTitle(const QString &);
1.5 信号
// QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
// 窗口的右键菜单策略 contextMenuPolicy() 参数设置为 Qt::CustomContextMenu, 按下鼠标右键发射该信号
[signal] void QWidget::customContextMenuRequested(const QPoint &pos);
// 窗口图标发生变化, 发射此信号
[signal] void QWidget::windowIconChanged(const QIcon &icon);
// 窗口标题发生变化, 发射此信号
[signal] void QWidget::windowTitleChanged(const QString &title);
1.6 槽函数
//------------- 窗口显示 -------------
// 关闭当前窗口
[slot] bool QWidget::close();
// 隐藏当前窗口
[slot] void QWidget::hide();
// 显示当前创建以及其子窗口
[slot] void QWidget::show();
// 全屏显示当前窗口, 只对windows有效
[slot] void QWidget::showFullScreen();
// 窗口最大化显示, 只对windows有效
[slot] void QWidget::showMaximized();
// 窗口最小化显示, 只对windows有效
[slot] void QWidget::showMinimized();
// 将窗口回复为最大化/最小化之前的状态, 只对windows有效
[slot] void QWidget::showNormal();
//------------- 窗口状态 -------------
// 判断窗口是否可用
bool QWidget::isEnabled() const; // 非槽函数
// 设置窗口是否可用, 不可用窗口无法接收和处理窗口事件
// 参数true->可用, false->不可用
[slot] void QWidget::setEnabled(bool);
// 设置窗口是否可用, 不可用窗口无法接收和处理窗口事件
// 参数true->不可用, false->可用
[slot] void QWidget::setDisabled(bool disable);
// 设置窗口是否可见, 参数为true->可见, false->不可见
[slot] virtual void QWidget::setVisible(bool visible);
2. 对话框类:QDialog
2.1 模态对话框
模态对话框在显示时,会阻塞当前程序中其它窗口与用户的交互,直到对话框被关闭,其它窗口才能继续接受用户的操作。
// 构造函数
QDialog::QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
// 模态显示窗口
[virtual slot] int QDialog::exec();
//返回结果的枚举值:
// 将 exec() 的返回值设置为 QDialog::Accepted,1,隐藏模态窗口, 并且解除模态窗口的阻塞
[virtual slot] void QDialog::accept();
// 将 exec() 的返回值设置为 QDialog::Rejected,0,隐藏模态窗口, 并且解除模态窗口的阻塞,
[virtual slot] void QDialog::reject();
// 关闭对话框并将其结果代码设置为r。finished()信号将发出r;
// 如果r是QDialog::Accepted 或 QDialog::Rejected,则还将分别发出accept()或Rejected()信号。
[virtual slot] void QDialog::done(int r);
[signal] void QDialog::accepted();
[signal] void QDialog::rejected();
[signal] void QDialog::finished(int result);
示例代码
// 创建对话框对象
MyDialog dlg;
int ret = dlg.exec();
if(ret == QDialog::Accepted)
{
qDebug() << "accept button clicked...";
// 显示主窗口
MainWindow* w = new MainWindow;
w->show();
}
else if(ret == QDialog::Rejected)
{
qDebug() << "reject button clicked...";
// 不显示主窗口
......
......
}
else
{
// ret == 666
qDebug() << "done button clicked...";
// 根据需求进行逻辑处理
......
......
}
2.2 非模态对话框
show函数可以显示非模态对话框,在显示出对话框后会立即返回,该方法没有返回值。而此后对话框仍在与用户继续交互。注意控制对话框对象的销毁时机。
注意:对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时只 是打开己创建的对话框对象
无论是模态对话框还是非模态对话框,都可以通过new运算符在堆中动态创建。为了使该对话框在被用户关闭后能够自动销毁,可为其设置Qt::WA_DeleteOnClose属性,如:
MyDialog* dlg = new MyDialog(this);
dlg->setAttribute(Qt::WA_DeleteOnClose);
这样即使不显式通过delete运算符销毁该对话框对象,也没有任何内存泄漏的风险。
3. QDialog的子类
3.1 QMessageBox
QMessageBox 对话框类是 QDialog 类的子类, 通过这个类可以显示一些简单的提示框, 用于展示警告、错误、问题等信息。关于这个类我们只需要掌握一些静态方法的使用就可以了。
// 显示一个模态对话框, 将参数 text 的信息展示到窗口中
[static] void QMessageBox::about(QWidget *parent, const QString &title, const QString &text);
/*
参数:
- parent: 对话框窗口的父窗口
- title: 对话框窗口的标题
- text: 对话框窗口中显示的提示信息
- buttons: 对话框窗口中显示的按钮(一个或多个)
- defaultButton
1. defaultButton指定按下Enter键时使用的按钮。
2. defaultButton必须引用在参数 buttons 中给定的按钮。
3. 如果defaultButton是QMessageBox::NoButton, QMessageBox会自动选择一个合适的默认值。
*/
// 显示一个信息模态对话框
[static] QMessageBox::StandardButton QMessageBox::information(
QWidget *parent, const QString &title,
const QString &text,
QMessageBox::StandardButtons buttons = Ok,
QMessageBox::StandardButton defaultButton = NoButton);
// 显示一个错误模态对话框
[static] QMessageBox::StandardButton QMessageBox::critical(
QWidget *parent, const QString &title,
const QString &text,
QMessageBox::StandardButtons buttons = Ok,
QMessageBox::StandardButton defaultButton = NoButton);
// 显示一个问题模态对话框
[static] QMessageBox::StandardButton QMessageBox::question(
QWidget *parent, const QString &title,
const QString &text,
QMessageBox::StandardButtons buttons = StandardButtons(Yes | No),
QMessageBox::StandardButton defaultButton = NoButton);
// 显示一个警告模态对话框
[static] QMessageBox::StandardButton QMessageBox::warning(
QWidget *parent, const QString &title,
const QString &text,
QMessageBox::StandardButtons buttons = Ok,
QMessageBox::StandardButton defaultButton = NoButton);
示例代码
void MainWindow::on_msgbox_clicked()
{
QMessageBox::about(this, "about", "这是一个简单的消息提示框!!!");
QMessageBox::critical(this, "critical", "这是一个错误对话框-critical...");
int ret = QMessageBox::question(this, "question",
"你要保存修改的文件内容吗???",
QMessageBox::Save|QMessageBox::Cancel,
QMessageBox::Cancel);
if(ret == QMessageBox::Save)
{
QMessageBox::information(this, "information", "恭喜你保存成功了, o(* ̄︶ ̄*)o!!!");
}
else if(ret == QMessageBox::Cancel)
{
QMessageBox::warning(this, "warning", "你放弃了保存, ┭┮﹏┭┮ !!!");
}
}
3.2 文件目录对话框:QFileDialog
QFileDialog对话框类是 QDialog 类的子类, 通过这个类可以选择要打开/保存的文件或者目录。关于这个类我们只需要掌握一些静态方法的使用就可以了。
打开本地目录
// 打开一个目录, 得到这个目录的绝对路径
[static] QString QFileDialog::getExistingDirectory(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
QFileDialog::Options options = ShowDirsOnly);
parent: 当前对话框窗口的父对象也就是父窗口
caption: 当前对话框窗口的标题
dir: 当前对话框窗口打开的默认目录
options: 当前对话框窗口的一些可选项,枚举类型, 一般不需要进行设置, 使用默认值即可
filter: 过滤器, 在对话框中只显示满足条件的文件, 可以指定多个过滤器, 使用 ;; 分隔
Images (*.png *.jpg)
Images (*.png *.jpg);;Text files (*.txt)
selectedFilter: 如果指定了多个过滤器, 通过该参数指定默认使用哪一个, 不指定默认使用第一个过滤器
// 示例代码
void MainWindow::on_filedlg_clicked()
{
QString dirName = QFileDialog::getExistingDirectory(this, "打开目录", "e:\\temp");
QMessageBox::information(this, "打开目录", "您选择的目录是: " + dirName);
}
打开本地文件
// 打开一个文件, 得到这个文件的绝对路径
[static] QString QFileDialog::getOpenFileName(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
QFileDialog::Options options = Options());
// 示例代码
void MainWindow::on_filedlg_clicked()
{
QString arg("Text files (*.txt)");
QString fileName = QFileDialog::getOpenFileName(
this, "Open File", "e:\\temp",
"Images (*.png *.jpg);;Text files (*.txt)", &arg);
QMessageBox::information(this, "打开文件", "您选择的文件是: " + fileName);
}
打开多个文件
// 打开多个文件, 得到这多个文件的绝对路径
[static] QStringList QFileDialog::getOpenFileNames(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
QFileDialog::Options options = Options());
// 示例代码
void MainWindow::on_filedlg_clicked()
{
QStringList fileNames = QFileDialog::getOpenFileNames(
this, "Open File", "e:\\temp",
"Images (*.png *.jpg);;Text files (*.txt)");
QString names;
for(int i=0; i { names += fileNames.at(i) + " "; } QMessageBox::information(this, "打开文件(s)", "您选择的文件是: " + names); } 打开保存文件对话框 // 打开一个目录, 使用这个目录来保存指定的文件 [static] QString QFileDialog::getSaveFileName( QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options()); void MainWindow::on_filedlg_clicked() { QString fileName = QFileDialog::getSaveFileName(this, "保存文件", "e:\\temp"); QMessageBox::information(this, "保存文件", "您指定的保存数据的文件是: " + fileName); } 3.3 字体属性设置框:QFontDialog QFontDialog类是QDialog的子类, 通过这个类我们可以得到一个进行字体属性设置的对话框窗口, 和前边介绍的对话框类一样, 我们只需要调用这个类的静态成员函数就可以得到想要的窗口了。 字体对话框 调用QFontDialog::getFont方法即可弹出字体对话框,参数如下: ok: 传出参数, 用于判断是否获得了有效字体信息, 指定一个布尔类型变量地址 initial: 字体对话框中默认选中并显示该字体信息, 用于对话框的初始化 parent: 字体对话框窗口的父对象 title: 字体对话框的窗口标题 options: 字体对话框选项, 使用默认属性即可, 一般不设置 [static] QFont QFontDialog::getFont( bool *ok, const QFont &initial, QWidget *parent = nullptr, const QString &title = QString(), QFontDialog::FontDialogOptions options = FontDialogOptions()); [static] QFont QFontDialog::getFont(bool *ok, QWidget *parent = nullptr); 示例代码 // 通过字体对话框选择字体, 并将选择的字体设置给当前窗口 void MainWindow::on_fontdlg_clicked() { #if 1 // 方式1 bool ok; QFont ft = QFontDialog::getFont( &ok, QFont("微软雅黑", 12, QFont::Bold), this, "选择字体"); qDebug() << "ok value is: " << ok; #else // 方式2 QFont ft = QFontDialog::getFont(NULL); #endif // 将选择的字体设置给当前窗口对象 this->setFont(ft); } 3.3.1 QFont - 字体类 通过QFont类来设置字体的属性信息 // 构造函数 QFont::QFont(); QFont::QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false); 参数 family: 本地字库中的字体名, 通过 office 等文件软件可以查看 pointSize: 字体的字号 weight: 字体的粗细, 有效范围为 0 ~ 99 italic: 字体是否倾斜显示, 默认不倾斜 设置字体属性 设置当前字体对象的字体名、字体大小、字体粗细、是否加粗、是否倾斜等属性 //设置字体名 void QFont::setFamily(const QString &family); // 根据字号设置字体大小 void QFont::setPointSize(int pointSize); // 根据像素设置字体大小 void QFont::setPixelSize(int pixelSize); // 设置字体的粗细程度, 有效范围: 0 ~ 99 void QFont::setWeight(int weight); // 设置字体是否加粗显示 void QFont::setBold(bool enable); // 设置字体是否要倾斜显示 void QFont::setItalic(bool enable); // 获取字体相关属性(一般规律: 去掉设置函数的 set 就是获取相关属性对应的函数名) QString QFont::family() const; bool QFont::italic() const; int QFont::pixelSize() const; int QFont::pointSize() const; bool QFont::bold() const; int QFont::weight() const; 设置字体 为窗口设置字体 // 给当前窗口设置字体, 只对当前窗口类生效 void QWidget::setFont(const QFont &); // 得到当前窗口使用的字体 const QWidget::QFont& font() const; // 给当前应用程序对象设置字体, 作用于当前应用程序的所有窗口 [static] void QApplication::setFont(const QFont &font, const char *className = nullptr); // 得到当前应用程序对象使用的字体 [static] QFont QApplication::font(); 3.4 颜色选择框:QColorDialog QColorDialog类是QDialog的子类, 通过这个类可以得到一个选择颜色的对话框窗口 使用QColorDialog::getColor方法即可弹出颜色选择对话框,参数如下: initial: 对话框中默认选中的颜色, 用于窗口初始化 parent: 给对话框窗口指定父对象 title: 对话框窗口的标题 options: 颜色对话框窗口选项, 使用默认属性即可, 一般不需要设置 // 弹出颜色选择对话框, 并返回选中的颜色信息 [static] QColor QColorDialog::getColor( const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()); 测试代码 /* 场景描述: 1. 在窗口上放一个标签控件 2. 通过颜色对话框选择一个颜色, 将选中的颜色显示到标签控件上 3. 将选中的颜色的 RGBA 值分别显示出来 */ void MainWindow::on_colordlg_clicked() { QColor color = QColorDialog::getColor(); QBrush brush(color); QRect rect(0, 0, ui->color->width(), ui->color->height()); QPixmap pix(rect.width(), rect.height()); QPainter p(&pix); p.fillRect(rect, brush); ui->color->setPixmap(pix); QString text = QString("red: %1, green: %2, blue: %3, 透明度: %4") .arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha()); ui->colorlabel->setText(text); } 3.4.1 QColor - 颜色类 关于颜色的属性信息, 在QT框架中被封装到了一个叫QColor的类中。 各种颜色都是基于红, 绿, 蓝这三种颜色调配而成的, 并且颜色还可以进行透明度设置, 默认是不透明的。 // 构造函数 QColor::QColor(Qt::GlobalColor color); QColor::QColor(int r, int g, int b, int a = ...); QColor::QColor(); // 参数设置 red, green, blue, alpha, 取值范围都是 0-255 void QColor::setRed(int red); // 红色 void QColor::setGreen(int green); // 绿色 void QColor::setBlue(int blue); // 蓝色 void QColor::setAlpha(int alpha); // 透明度, 默认不透明(255) void QColor::setRgb(int r, int g, int b, int a = 255); int QColor::red() const; int QColor::green() const; int QColor::blue() const; int QColor::alpha() const; void QColor::getRgb(int *r, int *g, int *b, int *a = nullptr) const; 获取颜色 // 弹出颜色选择对话框, 并返回选中的颜色信息 /* 参数: - initial: 对话框中默认选中的颜色, 用于窗口初始化 - parent: 给对话框窗口指定父对象 - title: 对话框窗口的标题 - options: 颜色对话框窗口选项, 使用默认属性即可, 一般不需要设置 */ [static] QColor QColorDialog::getColor( const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()); 示例代码 /* 场景描述: 1. 在窗口上放一个标签控件 2. 通过颜色对话框选择一个颜色, 将选中的颜色显示到标签控件上 3. 将选中的颜色的 RGBA 值分别显示出来 */ void MainWindow::on_colordlg_clicked() { QColor color = QColorDialog::getColor(); QBrush brush(color); QRect rect(0, 0, ui->color->width(), ui->color->height()); QPixmap pix(rect.width(), rect.height()); QPainter p(&pix); p.fillRect(rect, brush); ui->color->setPixmap(pix); QString text = QString("red: %1, green: %2, blue: %3, 透明度: %4") .arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha()); ui->colorlabel->setText(text); } 3.5 输入对话框窗口:QInputDialog QInputDialog类是输入对话框窗口, 根据实际需求我们可以在这个输入窗口中输入整形, 浮点型, 字符串类型的数据, 并且还可以显示下拉菜单供使用者选择。 浮点数输入对话框 // 得到一个可以输入浮点数的对话框窗口, 返回对话框窗口中输入的浮点数 [static] double QInputDialog::getDouble( QWidget *parent, const QString &title, const QString &label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); /* 参数: - parent: 对话框窗口的父窗口 - title: 对话框窗口显示的标题信息 - label: 对话框窗口中显示的文本信息(用于描述对话框的功能) - value: 对话框窗口中显示的浮点值, 默认为 0 - min: 对话框窗口支持显示的最小数值 - max: 对话框窗口支持显示的最大数值 - decimals: 浮点数的精度, 默认保留小数点以后1位 - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数 - flags: 对话框窗口的窗口属性, 使用默认值即可 */ void MainWindow::on_inputdlg_clicked() { double ret = QInputDialog::getDouble(this, "工资", "您的工资: ", 2000, 1000, 6000, 2); QMessageBox::information(this, "工资", "您的当前工资: " + QString::number(ret)); } 整形输入对话框 // 得到一个可以输入整形数的对话框窗口, 返回对话框窗口中输入的整形数 [static] int QInputDialog::getInt( QWidget *parent, const QString &title, const QString &label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); /* 参数: - parent: 对话框窗口的父窗口 - title: 对话框窗口显示的标题信息 - label: 对话框窗口中显示的文本信息(用于描述对话框的功能) - value: 对话框窗口中显示的整形值, 默认为 0 - min: 对话框窗口支持显示的最小数值 - max: 对话框窗口支持显示的最大数值 - step: 步长, 通过对话框提供的按钮调节数值每次增长/递减的量 - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数 - flags: 对话框窗口的窗口属性, 使用默认值即可 */ //示例代码 void MainWindow::on_inputdlg_clicked() { int ret = QInputDialog::getInt(this, "年龄", "您的当前年龄: ", 10, 1, 100, 2); QMessageBox::information(this, "年龄", "您的当前年龄: " + QString::number(ret)); } 下拉菜单对话框 // 得到一个带下来菜单的对话框窗口, 返回选择的菜单项上边的文本信息 [static] QString QInputDialog::getItem( QWidget *parent, const QString &title, const QString &label, const QStringList &items, int current = 0, bool editable = true, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone); /* 参数: - parent: 对话框窗口的父窗口 - title: 对话框窗口显示的标题信息 - label: 对话框窗口中显示的文本信息(用于描述对话框的功能) - items: 字符串列表, 用于初始化窗口中的下拉菜单, 每个字符串对应一个菜单项 - current: 通过菜单项的索引指定显示下拉菜单中的哪个菜单项, 默认显示第一个(编号为0) - editable: 设置菜单项上的文本信息是否可以进行编辑, 默认为true, 即可以编辑 - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数 - flags: 对话框窗口的窗口属性, 使用默认值即可 - inputMethodHints: 设置显示模式, 默认没有指定任何特殊显示格式, 显示普通文本字符串 - 如果有特殊需求, 可以参数帮助文档进行相关设置 */ void MainWindow::on_inputdlg_clicked() { QStringList items; items << "苹果" << "橙子" << "橘子" << "葡萄" << "香蕉" << "哈密瓜"; QString item = QInputDialog::getItem(this, "请选择你喜欢的水果", "你最喜欢的水果:", items, 1, false); QMessageBox::information(this, "水果", "您最喜欢的水果是: " + item); } 多行输入对话框 // 得到一个可以输入多行数据的对话框窗口, 返回用户在窗口中输入的文本信息 [static] QString QInputDialog::getMultiLineText( QWidget *parent, const QString &title, const QString &label, const QString &text = QString(), bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone); /* 参数: - parent: 对话框窗口的父窗口 - title: 对话框窗口显示的标题信息 - label: 对话框窗口中显示的文本信息(用于描述对话框的功能) - text: 指定显示到多行输入框中的文本信息, 默认是空字符串 - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数 - flags: 对话框窗口的窗口属性, 使用默认值即可 - inputMethodHints: 设置显示模式, 默认没有指定任何特殊显示格式, 显示普通文本字符串 - 如果有特殊需求, 可以参数帮助文档进行相关设置 */ void MainWindow::on_inputdlg_clicked() { QString info = QInputDialog::getMultiLineText(this, "表白", "您最想对漂亮小姐姐说什么呢?", "呦吼吼..."); QMessageBox::information(this, "知心姐姐", "您最想对小姐姐说: " + info); } 单行信息对话框 // 得到一个可以输入单行信息的对话框窗口, 返回用户在窗口中输入的文本信息 [static] QString QInputDialog::getText( QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone); /* 参数: - parent: 对话框窗口的父窗口 - title: 对话框窗口显示的标题信息 - label: 对话框窗口中显示的文本信息(用于描述对话框的功能) - mode: 指定单行编辑框中数据的反馈模式, 是一个 QLineEdit::EchoMode 类型的枚举值 - QLineEdit::Normal: 显示输入的字符。这是默认值 - QLineEdit::NoEcho: 不要展示任何东西。这可能适用于连密码长度都应该保密的密码。 - QLineEdit::Password: 显示与平台相关的密码掩码字符,而不是实际输入的字符。 - QLineEdit::PasswordEchoOnEdit: 在编辑时按输入显示字符,否则按密码显示字符。 - text: 指定显示到单行输入框中的文本信息, 默认是空字符串 - ok: 传出参数, 用于判断是否得到了有效数据, 一般不会使用该参数 - flags: 对话框窗口的窗口属性, 使用默认值即可 - inputMethodHints: 设置显示模式, 默认没有指定任何特殊显示格式, 显示普通文本字符串 - 如果有特殊需求, 可以参数帮助文档进行相关设置 */ void MainWindow::on_inputdlg_clicked() { QString text = QInputDialog::getText(this, "密码", "请输入新的密码", QLineEdit::Password, "helloworld"); QMessageBox::information(this, "密码", "您设置的密码是: " + text); } 3.6 进度条对话框:QProgressDialog 通过QProgressDialog类可以得到一个带进度条的对话框窗口, 这种类型的对话框窗口一般常用于文件拷贝、数据传输等实时交互的场景中。 创建进度条 // 构造函数 /* 参数: - labelText: 对话框中显示的提示信息 - cancelButtonText: 取消按钮上显示的文本信息 - minimum: 进度条最小值 - maximum: 进度条最大值 - parent: 当前窗口的父对象 - f: 当前进度窗口的flag属性, 使用默认属性即可, 无需设置 */ QProgressDialog::QProgressDialog( QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); QProgressDialog::QProgressDialog( const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); // 设置取消按钮显示的文本信息 [slot] void QProgressDialog::setCancelButtonText(const QString &cancelButtonText); // 公共成员函数和槽函数 QString QProgressDialog::labelText() const; void QProgressDialog::setLabelText(const QString &text); 设置进度条的值 // 得到进度条最小值 int QProgressDialog::minimum() const; // 设置进度条最小值 void QProgressDialog::setMinimum(int minimum); // 得到进度条最大值 int QProgressDialog::maximum() const; // 设置进度条最大值 void QProgressDialog::setMaximum(int maximum); // 设置进度条范围(最大和最小值) [slot] void QProgressDialog::setRange(int minimum, int maximum); // 得到进度条当前的值 int QProgressDialog::value() const; // 设置进度条当前的值 void QProgressDialog::setValue(int progress); bool QProgressDialog::autoReset() const; // 当value() = maximum()时,进程对话框是否调用reset(),此属性默认为true。 void QProgressDialog::setAutoReset(bool reset); bool QProgressDialog::autoClose() const; // 当value() = maximum()时,进程对话框是否调用reset()并且隐藏,此属性默认为true。 void QProgressDialog::setAutoClose(bool close); // 判断用户是否按下了取消键, 按下了返回true, 否则返回false bool wasCanceled() const; 重置进度条 // 重置进度对话框。wascancelled()变为true,直到进程对话框被重置。进度对话框被隐藏。 [slot] void QProgressDialog::cancel(); // 重置进度对话框。如果autoClose()为真,进程对话框将隐藏。 [slot] void QProgressDialog::reset(); 信号 // 当单击cancel按钮时,将发出此信号。默认情况下,它连接到cancel()槽。 [signal] void QProgressDialog::canceled(); // 设置窗口的显示状态(模态, 非模态) /* 参数: Qt::NonModal -> 非模态 Qt::WindowModal -> 模态, 阻塞父窗口 Qt::ApplicationModal -> 模态, 阻塞应用程序中的所有窗口 */ void QWidget::setWindowModality(Qt::WindowModality windowModality); 示例代码 /* 场景描述: 1. 基于定时器模拟文件拷贝的场景 2. 点击窗口按钮, 进度条窗口显示, 同时启动定时器 3. 通过定时器信号, 按照固定频率更新对话框窗口进度条 4. 当进度条当前值 == 最大值, 关闭定时器, 关闭并析构进度对话框 */ void MainWindow::on_progressdlg_clicked() { // 1. 创建进度条对话框窗口对象 QProgressDialog *progress = new QProgressDialog( "正在拷贝数据...", "取消拷贝", 0, 100, this); // 2. 初始化并显示进度条窗口 progress->setWindowTitle("请稍后"); progress->setWindowModality(Qt::WindowModal); progress->show(); // 3. 更新进度条 static int value = 0; QTimer *timer = new QTimer; connect(timer, &QTimer::timeout, this, [=]() { progress->setValue(value); value++; // 当value > 最大值的时候 if(value > progress->maximum()) { timer->stop(); value = 0; delete progress; delete timer; } }); connect(progress, &QProgressDialog::canceled, this, [=]() { timer->stop(); value = 0; delete progress; delete timer; }); timer->start(50); } 进度窗口效果展示: