• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

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);
}

关键注意点

  1. Qt::WindowModal:模态,阻塞父窗口交互
  2. canceled()信号:用户点击取消按钮触发,停止后台任务
  3. autoClose(true):进度走到最大值,对话框自动隐藏
  4. 耗时任务不能直接写在循环里,会阻塞UI线程,一般搭配QTimer/子线程使用。

Qt内置标准对话框小结

类 用途 使用方式
QFontDialog 选择字体 静态函数getFont()
QColorDialog 选择颜色 静态函数getColor()
QInputDialog 输入各类数据 getInt / getDouble / getItem / getText / getMultiLineText
QProgressDialog 进度条对话框 new对象,动态setValue更新进度

面试小要点:

  1. getXXX系列静态对话框,都是模态对话框,调用会阻塞代码往下走。
  2. QProgressDialog不要在UI线程死循环,会界面卡死,需要定时器/子线程更新进度。
posted on 2026-08-31 22:21  SobNov  阅读(4)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3