2014-11-19 3 views
-1

Диалог открывается двумя кнопками, OK и Отмена. Ни одна из кнопок не реагирует на щелчок пользователя. Я должен нажать X в правом верхнем углу, чтобы отменить диалог.Qt, кнопки QDialog не Respondig

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (obj == mTabWidget && event->type() == QEvent::MouseButtonDblClick) 
    { 
     // query and set tab(s) names 
     QTabWidget *tab = qobject_cast<QTabWidget *>(obj); 
     if(tab) 
     { 
      QDialog dlg; 
      QVBoxLayout la(&dlg); 
      QLineEdit ed; 
      la.addWidget(&ed); 
      QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); 
      la.addWidget(&bb); 
      dlg.setLayout(&la); 
      if(dlg.exec() == QDialog::Accepted) 
      { 
       tab->setTabText(0, ed.text()); 
       return true; 
      } 
     } 
    } 

    // Standard event processing 
    return QObject::eventFilter(obj, event); 
} 

Я пропустил какой-либо connect() линии или сигналы? Я попытался прочитать документацию Qt, но из того, что понял, вызов QDialogButtonBox::OK обрабатывается как принятый.

UPDATE:

Новый диалог Функция

ОК, я создал новую функцию, которая заботится о диалоговом окне, я зову его из функции событий. он все еще не отвечает, теперь на терминале я вижу ошибку, которая говорит: нет такого слота MainWindow :: accept() и другого для отклонения. Я знаю, что у меня нет слотов для этих двух файлов .h. я попытался найти, как построить слоты, но я не мог, любая помощь была бы замечательной. спасибо

void MainWindow::initializeBOX() 
{ 
QDialog dlg; 
     QVBoxLayout la(&dlg); 
     QLineEdit ed; 
     la.addWidget(&ed); 


     //QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); 
     //btnbox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); 
     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |    QDialogButtonBox::Cancel); 

     connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); 
     connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); 

     la.addWidget(buttonBox); 
     dlg.setLayout(&la); 


     if(dlg.exec() == QDialog::Accepted) 
     { 
      mTabWidget->setTabText(0, ed.text()); 
     } 

     } 
+0

Немного подозрительно, что вы 'exec 'в диалоговом окне фильтра событий. Вероятно, это блокирует обработку дальнейших событий. –

+0

Любая причина, по которой вы не используете статический ['QString QInputDialog :: getText (...)'] (http://qt-project.org/doc/qt-4.8/qinputdialog.html)? Мне кажется, что вы ничего не делаете, чтобы предотвратить использование. – Bowdzone

+0

@Andrew я отредактировал мой код, можете ли вы проверить новую функцию. он все еще не отвечает на нажатую кнопку – AAFF

ответ

0

Вместо того, чтобы запускать диалог с события FILER вы должны ловушкой QWidget::mouseDoubleClickEvent от перегрузки, что виртуальная функции в вашем коде. И пока это обратный вызов, вы можете делать больше вещей сразу же, включая диалог. Или, возможно, отправить сигнал в слот, который делает диалог (немного чище). Я бы сделал сигнал от обработчика событий mouseDoubleClickEvent и заставил родительский QWidget :: mouseDoubleClickEvent использовать это событие, чтобы избежать возможных осложнений, особенно при переносе кода на другую платформу.

Фильтры событий предназначены для нестандартной обработки событий. В вашем случае нет ничего нестандартного.

+0

Я отредактировал мой код, можете ли вы проверить новую функцию. он по-прежнему не отвечает на нажатие кнопки @AlexanderVX – AAFF

+0

AAFF, см. примеры Qt Dialog. Примеры: http://qt-project.org/doc/qt-5/examples-dialogs.html. Что вы сделали, может быть, интересно, но Qt ожидает, что вы напишете код в каком-то окне. И, пожалуйста, не используйте фильтр событий для запуска диалога, но обработчик событий. – AlexanderVX

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