Qt QFontDialog 字体对话,QColorDialog 颜色对话,QInputDialog 输入对话,QProgressDialog 进度对话
Qt QFontDialog 字体对话,QColorDialog 颜色对话,QInputDialog 输入对话,QProgressDialog 进度对话笔记
1. QFontDialog 字体对话框
作用:弹出系统字体选择对话框,选择字体、字号、加粗、斜体等字体属性。
常用静态API
// 方式1:带返回ok,判断用户是否点击确定
QFont QFontDialog::getFont(bool *ok,
const QFont &initial,
QWidget *parent = nullptr,
const QString &title = QString());
// 方式2:简化版本,直接获取字体
QFont QFontDialog::getFont(QWidget *parent = nullptr);
代码示例
void MainWindow::on_fontdlg_clicked()
{
#if 0
bool ok;
// 初始字体:微软雅黑,12号,加粗
QFont ft = QFontDialog::getFont(&ok,QFont("微软雅黑",12,QFont::Bold),this,"选择字体");
qDebug()<<"ok value is: "<<ok;
#else
QFont ft = QFontDialog::getFont(nullptr);
#endif
// 将选中字体设置给label
ui->fontlabel->setFont(ft);
}
ok:输出参数,用户点击确定为true,点击取消为false- 返回值
QFont:选中的字体对象
2. QColorDialog 颜色对话框
作用:选取颜色,可以获取RGB与透明度Alpha值。
常用静态API
// 获取颜色
QColor QColorDialog::getColor(const QColor &initial = Qt::white,
QWidget *parent = nullptr,
const QString &title = QString(),
QColorDialog::ColorDialogOptions options = ColorDialogOptions());
代码示例
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);
// 格式化输出rgb、透明度
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);
}
color.red()/green()/blue()/alpha()获取颜色四通道QPainter在QPixmap画布绘制填充色块,展示选中颜色
3. QInputDialog 输入对话框
作用:弹出对话框,获取用户输入:整数、浮点数、下拉选项、单行文本、多行文本。
常用静态API
// 获取整数
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());
// 获取浮点数
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());
// 获取下拉选择项
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());
// 获取单行文本
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());
// 获取多行文本
QString QInputDialog::getMultiLineText(QWidget *parent, const QString &title, const QString &label,
const QString &text = QString(), bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
代码示例
#define MULTITEXT
void MainWindow::on_inputdlg_clicked()
{
#ifdef INT
int ret = QInputDialog::getInt(this,"年龄","你当前年龄:",10,1,100,2);
QMessageBox::information(this,"年龄","你当前年龄:"+QString::number(ret));
#endif
#ifdef DOUBLE
double ret = QInputDialog::getDouble(this,"工资","你当前工资:",2000,1000,6000,2);
QMessageBox::information(this,"工资","你当前工资:"+QString::number(ret));
#endif
#ifdef IETM
QStringList items;
items<<"苹果"<<"橙子"<<"葡萄"<<"香蕉"<<"哈密瓜";
QString item = QInputDialog::getItem(this,"水果","请选择你最喜欢的水果",items,0,false);
QMessageBox::information(this,"水果","你最喜欢的水果是:"+item);
#endif
#ifdef TEXT
QString text = QInputDialog::getText(this,"密码","请输入密码",QLineEdit::Password,"password");
QMessageBox::information(this,"密码","你的密码是:"+text);
#endif
#ifdef MULTITEXT
QString info = QInputDialog::getMultiLineText(this,"表白","你想对小姐姐说什么呢?","哟,花姑娘");
QMessageBox::information(this,"知心姐姐","你想对小姐姐说:"+info);
#endif
}
4. QProgressDialog 进度对话框
作用:耗时操作时显示进度条对话框,支持取消按钮。
核心API
构造函数
// 构造1
QProgressDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
// 构造2(常用)
QProgressDialog(const QString &labelText, const QString &cancelButtonText,
int minimum, int maximum, QWidget *parent = nullptr,
Qt::WindowFlags f = Qt::WindowFlags());
属性与槽函数
// 设置进度范围
void setRange(int minimum, int maximum);
void setMinimum(int minimum);
void setMaximum(int maximum);
// 设置/获取当前进度值
void setValue(int progress);
int value() const;
// 设置提示文字
void setLabelText(const QString &text);
void setCancelButtonText(const QString &cancelButtonText);
// 自动关闭:进度达到最大值自动隐藏对话框,默认true
void setAutoClose(bool close);
bool autoClose() const;
// 自动重置,完成后重置进度
void setAutoReset(bool reset);
bool autoReset() const;
// 判断用户是否点击取消
bool wasCanceled() const;
// 槽函数
void cancel(); // 点击取消按钮触发
void reset(); // 重置进度对话框
// 信号:点击取消按钮发出
void canceled();
// 设置模态
void setWindowModality(Qt::WindowModality windowModality);
完整代码示例(搭配QTimer模拟耗时任务)
void MainWindow::on_progressdlg_clicked()
{
//1. 创建进度对话框对象
QProgressDialog* progress = new QProgressDialog(
"正在拷贝数据...","取消拷贝",0,100,this);
//2. 初始化并显示进度条窗口
progress->setWindowTitle("请稍后");
progress->setWindowModality(Qt::WindowModal);
progress->show();
static int value = 0;
QTimer* timer = new QTimer;
// 更新进度
connect(timer,&QTimer::timeout,this,[=](){
progress->setValue(value);
value++;
if(value > progress->maximum()){
timer->stop();
value=0;
delete progress;
delete timer;
}
});
// 用户点击取消按钮
connect(progress,&QProgressDialog::canceled,this,[=](){
timer->stop();
value=0;
});
timer->start(50);
}
关键注意点
Qt::WindowModal:模态,阻塞父窗口交互canceled()信号:用户点击取消按钮触发,停止后台任务autoClose(true):进度走到最大值,对话框自动隐藏- 耗时任务不能直接写在循环里,会阻塞UI线程,一般搭配
QTimer/子线程使用。
Qt内置标准对话框小结
| 类 | 用途 | 使用方式 |
|---|---|---|
| QFontDialog | 选择字体 | 静态函数getFont() |
| QColorDialog | 选择颜色 | 静态函数getColor() |
| QInputDialog | 输入各类数据 | getInt / getDouble / getItem / getText / getMultiLineText |
| QProgressDialog | 进度条对话框 | new对象,动态setValue更新进度 |
面试小要点:
getXXX系列静态对话框,都是模态对话框,调用会阻塞代码往下走。- QProgressDialog不要在UI线程死循环,会界面卡死,需要定时器/子线程更新进度。
浙公网安备 33010602011771号