2010-11-05 7 views
1

Я использую QT для реализации некоторой программы пользовательского интерфейса. В этой программе мне нужен диалог прогресса. Я попытался использовать встроенный QProgressDialog, он отлично работает, но в моем случае мне нужно подтвердить (с другим диалогом), когда нажата кнопка «Отменить».реализовать диалог выполнения QDialog

В QProgressDialog после нажатия кнопки отмены диалог выполнения будет отменен, поэтому я попытался реализовать свой собственный диалог выполнения (очень просто, диалог с индикатором выполнения). Однако, если я использую свой собственный диалог прогресса, есть некоторые проблемы. Его нельзя переместить или щелкнуть. Как только я попытался переместить его и потеря его в диалоговом режиме, индикатор прогресса больше не обновится, и он не сможет снова получить фокус. Я попытался установить другую модальность, но либо 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; 
} 
+0

Я бы подкласс QProgressDialog, а затем просто вызвать другой диалог, когда кнопка отмены нажата. QMessageDialog может быть хорошим кандидатом. – Jay

+0

Привет, Джеймс: Это то, что я делаю раньше. Однако проблема заключается в том, что сигнал «отменить» выдается после нажатия кнопки отмены, и диалог будет отменен, как я уже упоминал ранее. Я хочу, чтобы он был отменен только после подтверждения. –

ответ

2

Из Qt Документация: QProgressDialog сигнал :: отменен() испускается, когда кнопка отмены нажата и он подключен к отменить() по умолчанию.

Вы пытались подключить отмененный сигнал к своему собственному слоту проверки и отменить диалог, если пользователь подтвердил выбор?

Перед, подключив собственный слот, отключите отмененный сигнал от отмены слота с помощью QObject :: разъединение(): http://doc.qt.io/archives/qt-4.7/qobject.html#disconnect

+0

Да, я попробовал ~~ Я могу подключить сигнал «отменить» в свой собственный слот, однако реальная проблема заключается в том, что я не могу удалить встроенное соединение QProgressDialog, поскольку я наследую его. Как только выдается сигнал отмены, вызывается как мой слот, так и встроенный слот, и чтобы диалог был отменен. –

+0

QObject имеет метод отключения. Вы пытались отключить отмененный сигнал от слота отмены, прежде чем подключать его к своему слоту? http://doc.qt.nokia.com/4.7/qobject.html#disconnect –

+0

Спасибо! Я обнаружил, что проблема в том, что я пытаюсь «перезаписать» слот отмены, после того как я сменил имя, я могу правильно отключить слот: D! –

 Смежные вопросы

  • Нет связанных вопросов^_^