【问题标题】:implement a progress dialog by QDialog通过 QDialog 实现进度对话框
【发布时间】:2010-11-05 04:24:03
【问题描述】:

我正在使用 QT 来实现一些 UI 程序。 在这个程序中,我需要一个进度对话框。我尝试使用内置的 QProgressDialog,它工作正常,但在我的情况下,我需要在单击“取消按钮”时确认(使用另一个对话框)。

在QProgressDialog中,一旦点击取消按钮,进度对话框就会被取消,所以,我尝试实现自己的进度对话框(很简单,一个带进度条的对话框)。但是,如果我使用自己的进度对话框,就会出现一些问题。它无法移动或单击。一旦我尝试移动它并且对话框失去焦点,进度条将不再更新,并且无法再次获得焦点。我尝试设置不同的 Modality,但无论是 Qt::ApplicationModal 还是 Qt::WindowModal 都有相同的情况。

以下是我的进度对话框类,如果有人知道如何修改 QProgressDialog 以满足确认要求或我的代码中的问题在哪里。

标题:

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

    void setRange(int minimum, int maximum);
    void setValue(int value);
    void setLabelText(QString labtext);
    bool wasCanceled();

private:
    Ui::Dialog *ui;
    bool cancelStatus;

private slots:
    void cancel();
};

来源:

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    cancelStatus = false;
    ui->progressBar->setRange(0,1);
    ui->progressBar->setValue(0);
    //this->setWindowModality(Qt::WindowModal);
    show();
}

Dialog::~Dialog(){
    delete ui;
}

void Dialog::setRange(int minimum, int maximum){
    ui->progressBar->setRange(minimum,maximum );
}

void Dialog::setValue(int value){
    this->ui->progressBar->setValue(value);
}

void Dialog::setLabelText(QString labtext){
    this->ui->label->setText(labtext);
}

void Dialog::cancel(){
// pop up the confirm dialog here
// cancelStatus = true if the confirm dialog is accepted, else do nothing .
}

bool Dialog::wasCanceled(){
    return cancelStatus;
}

【问题讨论】:

  • 我将继承 QProgressDialog,然后在单击取消按钮时调用另一个对话框。 QMessageDialog 可能是一个不错的选择。
  • 嗨詹姆斯:这就是我以前做的。但是,问题是一旦单击取消按钮就会发出“取消”信号,并且对话框将被取消,正如我之前提到的。我想要的是确认后才会取消。

标签: qt qt4 progressdialog qdialog qprogressbar


【解决方案1】:

来自 Qt 文档:单击取消按钮时会发出信号 QProgressDialog::canceled(),默认情况下它连接到 cancel() 插槽。

您是否尝试将取消的信号连接到您自己的验证槽,如果用户确认是选择则取消对话框?

在连接您自己的插槽之前,使用 QObject::disconnect() 将取消的信号从取消插槽断开:http://doc.qt.io/archives/qt-4.7/qobject.html#disconnect

【讨论】:

  • 是的,我试过~~我可以将“取消”信号连接到我自己的插槽,但是,真正的问题是我无法删除 QProgressDialog 的内置连接,因为我继承了它。一旦发出取消信号,我的插槽和内置插槽都将被调用,因此对话框将被取消。
  • QObject 有一个断开连接的方法。您是否尝试在将取消信号连接到您自己的插槽之前将其从取消插槽断开? doc.qt.nokia.com/4.7/qobject.html#disconnect
  • 谢谢!!我发现问题是我尝试“覆盖”取消插槽,更改名称后,我可以正确断开插槽:D!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多