2013-09-20 5 views
0

У меня есть настраиваемый кнопочный набор для запуска/закрытия виджета диалогового окна, который я создал.Виджеты Qt PushButton exec

Моя идея - когда кнопка установлена, она закроет виджет диалогового окна. Если он не установлен, он должен открыть виджет диалогового окна. Но я не могу заставить его работать. Он продолжает открывать экземпляры диалогового виджета. Я хотел открыть только один экземпляр диалогового виджета. Может ли кто-нибудь помочь?

MainDlg::MainDlg() 
{ 
    connect(dialogButton, SIGNAL(clicked()), this, SLOT(setDialog())); 
} 

void MainDlg::setDialog() 
{ 
    SetDialogDlg setDlg; 
    if(dialogButton->isChecked()) 
    { 
     setDlg.close(); 
    } 
    else 
    { 
     setDlg.exec(); 
    } 
} 

ответ

1

В коде есть несколько неправильных вещей. Во-первых, ваш объект SetDialogDlg будет существовать только внутри вашей функции MainDlg::setDialog(). Как только эта функция завершится, ваш объект SetDialogDlg будет уничтожен.

Затем вы создаете новый экземпляр SetDialogDlg каждый раз, когда вызывается функция MainDlg::setDialog(). И вы пытаетесь закрыть диалоговое окно, которое еще не показано.

Тогда возникает проблема с setDlg.exec(). Это блокирующая функция. Таким образом, вы даже не сможете нажать dialogButton после отображения диалогового окна.

Для решения этих проблем у вас должна быть переменная-член в классе MainDlg.

//maindlg.h 
... 
public: 
    SetDialogDlg *myDialog; 
... 

//maindlg.cpp 
MainDlg::MainDlg() 
{ 
    ... 
    myDialog = new SetDialogDlg(this); 
    ... 
} 

Тогда внутри MainDlg::setDialog() функции, вызовите QWidget::show() вместо QDialog::exec().

void MainDlg::setDialog() 
{ 
    if(dialogButton->isChecked()) 
    { 
     myDialog->close(); 
    } 
    else 
    { 
     myDialog->show(); 
    } 
} 
+0

Thanks thuga! Он работает прямо сейчас. Однако он работает в первый раз. Я нажал на кнопку, она показывает. Следующий щелчок скрывает диалог в фоновом режиме. Но следующий щелчок не отображает диалоговое окно. Это как-то связано с моей инструкцией if-else? – Wallace

+1

@Wallace Он должен работать. Я тестировал код с тем же оператором 'if', и он отлично работает. Вы можете использовать класс [QDebug] (http://qt-project.org/doc/qt-5.0/qtcore/qdebug.html), чтобы проверить, работают ли операторы 'if'. Просто добавьте 'qDebug() <<" внутри if ";' внутри оператора 'if' и' qDebug() << "внутри else;' внутри оператора 'else'. Не забудьте включить заголовок:' #include ' – thuga

+0

Извините @thuga. Моя ошибка. Я решил это. Спасибо, куча! :) У вас есть идея, как сделать эффект слайда/слайда или эффекта затухания? (Предположим, у меня есть подходящая панель инструментов. Я нажимаю на кнопку на панели инструментов, диалоговое окно виджета будет иметь «выдвижная» эффект на панели инструментов. при нажатии на кнопку еще раз, диалог виджет будет «вставные» на панели инструментов) – Wallace

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