QProgressDialog 你可能想了解的一些内容

                        <h3 id="h3-u5173u4E8Eu6A21u6001u8BBEu7F6E"><a name="关于模态设置" class="reference-link"></a><span class="header-link octicon octicon-link"></span>关于模态设置</h3><p>QProgressDialog可以设置模态(需要在new的时候传入parent),QProgressBar设置不好;<br>只有dialog可以设置模态,widget不能设置模态(QProgressBar继承自widget)</p>

关于位置设置

子窗口要相对于父窗口设置合适的位置,父窗口在屏幕上移动,子窗口对应跟着改变大小与位置:
1 先设置子窗口的width与height,可以按父窗口的比例来;
2 然后以父窗口的左上角为原点计算子窗口的位置QPoint;
3 将2中的位置使用父窗口的mapToGlobal换算到屏幕的位置;
4 将3中得到的位置设置给子窗口;
如果子窗口设置成无边框的,则子窗口位置设置自动转换成相对于父窗口的位置,此时不再需要转换屏幕坐标设置;

关于无边框,无取消按钮

setCancelButton(0);//隐藏取消按钮
setWindowFlags(Qt::FramelessWindowHint);//无边框
setStyleSheet(“QWidget{background-color: rgb(255,255,255);}”);//背景板是白色

关于进度条样式

取消显示百分比,QProgressBar的setTextVisiable可以设置;
但是QProgressDialog没有setTextVisiable怎么办?
这时new一个QProgressBar(该QProgressDialog可构造设置为其parent,方便管理),
然后QProgressDialog调用setBar即可;
progressBar再设置setTextVisiable(false)即可。
进度条还可以设置QSS样式;

进度条大小控制

有setFixedSize()与setMinminSize();
先设置最小大小,然后设置固定大小,则最小限制被抵消;反之则可行;

示例代码

在使用它的对话框构造函数中new一个对象
    //无边框
    //progress_dialog_(new QProgressDialog(this, (Qt::Window | Qt::FramelessWindowHint)))
    //只有右上角叉叉按钮
    progress_dialog_(new QProgressDialog(this, (Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint)))

    //用法:
    progress_dialog_->setMinimumSize(300, 120);
    //设置进度对话框采用模态方式进行,即显示进度的同时,其他窗口将不响应输入信号
    progress_dialog_->setWindowModality(Qt::WindowModal);
    //如果进度条运行的时间小于5,进度条就不会显示,默认是4S
    progress_dialog_->setMinimumDuration(10);
    //设置进度对话框的窗体标题
    progress_dialog_->setWindowTitle(tr("Please Wait"));
    //设置进度对话框的显示文字信息
    progress_dialog_->setLabelText(tr("tips: request game list."));
    //设置进度对话框的“取消”按钮的显示文字
    //progress_dialog_->setCancelButtonText(tr("Cancel"));
    progress_dialog_->setCancelButton(0);//不显示取消按钮
    //设置进度对话框的步进范围
    progress_dialog_->setRange(0, 100);
    progress_dialog_->setAutoClose(true);    
    //为了隐藏QProgressDialog进度条上的进度文字
    QProgressBar * prog = new QProgressBar(progress_dialog_);
    prog->setTextVisible(false);
    progress_dialog_->setBar(prog);

    //可以启用一个定时器看效果
    static int steps = 0;
    QTimer *tm = new QTimer(this);
    connect(tm, &QTimer::timeout, [=]() { 
        steps++;
        progress_dialog_->setValue(steps);
        if (steps > progress_dialog_->maximum() || progress_dialog_->wasCanceled())
        { 
            tm->stop();
            steps = 0;
            progress_dialog_->cancel();
            //delete progress_dialog_;
        }
    });
    tm->start(50);
posted @   mkmkbj  阅读(136)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示