2014-09-18 11 views
0

Мне нужно использовать диалог со строкой состояния. Я не знаю, как использовать его в QDialog, поэтому я использую QMainWindow. Но QMainWindow не имеет функции exec() и show() функция работает асинхронно.Диалог с панелью состояния

Я использую QtDesigner, и я не понял, как добавить строку состояния, используя ее. Я также хочу видеть подсказки о состоянии виджетов widnow в этой строке состояния.

+0

Почему вы не можете использовать строку состояния в 'QDialog '? 'QDialog' -' QWidget'. То же, что и 'QMainWindow'. Не могли бы вы описать конечный результат, которого вы хотите достичь? –

+0

В качестве побочного примечания/разговора: модальные диалоги, которые блокируют графический интерфейс, часто плохой дизайн пользовательского интерфейса. Пользователь может часто хотеть проверять некоторые вещи из основного приложения, в то время как диалог открыт, и это действительно раздражает, чтобы закрыть диалоговое окно, чтобы проверить его, возможно, скопировать-вставить что-то в другое место, чтобы его можно было посмотреть, пока диалог открыт, затем повторно откройте диалоговое окно. Особенно раздражает многостраничные диалоговые окна мастера, в которых вы могли заполнить много страниц, а затем переделать все. Итак, если есть другой способ, используйте это для лучшего UX. Иногда просто делайте диалог немодальным. – hyde

ответ

2

Вы можете mak e ваше собственное диалоговое окно модальное с QWidget::setWindowModality, возможно ApplicationModal or WindowModal, например, в его конструкторе. Кроме того, вы, вероятно, захотите установить window flags for dialog, чтобы вы могли предоставить вам диалог родителя. Таким образом, добавить их в диалоговом конструкторе MainWindow:

setWindowModality(Qt::ApplicationModal); 
setWindowFlags(Qt::Dialog); 

Таким образом, он откроется, как независимое окно даже с одним из родителей, не блокировать остальную часть графического интерфейса пользователя, пока закрыты, препятствовать тому, чтобы получать события пользовательского ввода. Это должно вести себя так же, как если бы вы использовали QDialog::open.

Чтобы уловить пользователя, закрывающего диалог, вы должны, вероятно, добавить к нему тот же самый signals as used by QDialog и испустить их соответственно. Таким образом, вы можете использовать свой собственный диалог и QDialog, а также ваш код легче понять (это называется статическим полиморфизмом , предоставляя семантически несвязанные, но функционально эквивалентные вещи с одинаковыми именами).


Вот пример кода, первый конструктор DialogWindow пользовательского класса:

DialogWindow ::DialogWindow (QWidget *parent) : QMainWindow(parent) 
{ 
    setWindowFlags(Qt::Dialog); 
    setWindowModality(Qt::ApplicationModal); 
    setCentralWidget(new QLabel("Dialog")); // show some content 
} 

И тогда main функция, чтобы использовать его:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QPushButton w("Open the Dialog"); // the "main window" of the whole application 
    DialogWindow *dialog = new DialogWindow (&w); 
    QObject::connect(&w, SIGNAL(clicked()), dialog, SLOT(show())); 
    w.show(); 

    return a.exec(); 
} 
+0

Это не работает – Ufx

+0

@Ufx Добавлены соответствующие фрагменты кода, которые сработали для меня – hyde

+0

Мой класс, основанный на QMainWindow, не является «главным окном» всего приложения. Я не уверен, что сделал правильно, но это не работает для меня. Окно было показано асинхронно. – Ufx

2

Создать диалог с QVBoxLayout, например.

Разместите необходимый виджет и добавьте QStatusBar на снизу.

В main.cpp:

QDialog dlg; 
QLayout *l = new QVBoxLayout(&dlg); 
QLabel *lbl = new QLabel("text"); 
QPushButton *bb = new QPushButton("text"); 
l->addWidget(bb); 
l->addWidget(lbl); 
QStatusBar *b = new QStatusBar; 
l->addWidget(b); 
b->showMessage("text"); 
l->setMargin(0); 
l->setSpacing(0); 
dlg.show(); 

Update: советы статуса вы должны создать подкласс QDialog:

dia.h:

#ifndef DIA_H 
#define DIA_H 

#include <QDialog> 
#include <QStatusBar> 
#include <QLayout> 
#include <QApplication> 
#include <QTextEdit> 
#include <QStatusTipEvent> 
#include <QPushButton> 

class Dia : public QDialog { 
public: 
    Dia() : QDialog() 
    { 
     QVBoxLayout *l = new QVBoxLayout(this); 
     QTextEdit *te = new QTextEdit; 
     te->setStatusTip("this is TextEdit"); 
     l->addWidget(te); 
     QPushButton *bb = new QPushButton("tezt"); 
     bb->setStatusTip("this is button"); 
     l->addWidget(bb); 
     bar = new QStatusBar; 
     l->addWidget(bar); 
     l->setMargin(0); 
     l->setSpacing(0); 
    } 
private: 
    QStatusBar *bar; 
protected: 
    bool event(QEvent *e) 
    { 
     if(e->type()==QEvent::StatusTip) 
     { 
      QStatusTipEvent *ev = (QStatusTipEvent*)e; 
      bar->showMessage(ev->tip()); 
      return true; 
     } 
     return QDialog::event(e); 
    } 
}; 
#endif // DIA_H 

Использование:

#include "dia.h" 
//...  
Dia dlg; 
dlg.show(); 
+0

Это работает, но как я могу нарисовать подсказки о состоянии, когда курсор находится под виджетами? И можно ли это сделать с помощью QtDesigner? – Ufx

+1

@Ufx, вы не упомянули тексты статуса в своем вопросе. Пожалуйста, расширьте свой вопрос, чтобы все знали, какая функциональность вам нужна. – vahancho

+0

@Ufx см. Мое обновление, пожалуйста, подсказки статуса немного сложнее. Я добавил несколько виджетов и setStatusTip для каждого виджета и сделал код более удобочитаемым. – Chernobyl