2015-04-22 4 views
0

У меня есть класс, который является подклассом QDialog без перекрывая exec(), accept() или reject() и еще один, который вызывает Dialog класс внутри его mousePaintEvent:Использование QDialog внутри MousePressEvent

void Canvas::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::LeftButton){ 
     if (dialog->isVisible()){ 
      dialog->setModal(true); 
      dialog->move(QWidget::mapToGlobal(event->pos())); 
      //I connect the dialog's accepted signal to the CallingClass's slot, that uses the information taken from the dialog 
      connect(dialog, &Dialog::accepted, this, &CallingClass::slot); 
      dialog->exec(); 
     } 
    } 
    if (dialog->isVisible()){ 
     if (dialog->rect().contains(event->pos())){ 
      dialog->reject(); 
     } 
    } 
} 

Я попытался с помощью существование Dialog для check, но delete действительно не работал (я положил его после dialog.reject()), я даже попытался использовать bool, который я, опять же, установил в false после dialog.reject() в последнем, если, но я начните думать, что ничего не работает после .reject(). Как мне продолжить?

+1

, что вы на самом деле пытаетесь сделать с точки зрения высокого уровня? – UmNyobe

+0

Это событие рисования «Холста» (которое является QOpenGlWidget). Я хочу открыть диалоговое окно с щелчком мыши левой кнопкой мыши, из которого я могу выбрать, что рисовать на холсте, и, хотя диалог открыт, я хочу, чтобы его можно было закрыть, щелкнув его. –

ответ

0

Проблемы с IsVisible всегда возвращается ложной было из-за этого только возвращает истину, если все предки видимы, как указано здесь: http://doc.qt.io/qt-5/qwidget.html#visible-prop То, что я не в состоянии понять, почему некоторые из предков (класс является дочерним по отношению QWidget child QTabWidget, добавленный из QDesigner) не будет помечен как видимый, так как они отображаются на экране. Я не получил IsVisible, чтобы показать, виден ли виджет действительно (как это), но я применил обходной путь, используя классический булево подход:

void Class::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::LeftButton){ 
     if (!dialogOpened){ 
      dialog->show(); 
      dialogOpened = true; 
     } else { 
      dialog->hide(); 
      dialogOpened = false; 
     } 
    } 
} 
1

Я понимаю, что dialog-> rect() не дает вам то, что вы хотите (см. this). К сожалению, я не могу проверить это прямо сейчас, но я думаю, вы должны попытаться использовать его в сочетании с pos или попробуйте напрямую использовать frameGeometry. При этом у вас будет реальная позиция и размер вашего окна относительно его родителя. Попытайтесь увидеть значения, которые вы получаете как координаты из события click и значения из этих методов, чтобы точно определить, как их использовать ... В основном вам нужно будет решить, следует ли использовать глобальные координаты для рабочего стола относительно вашего родительское окно.

+0

Хотя это помогает, я понимаю, что не задал вопрос правильно. Речь идет о том, как проверить, присутствует ли диалог, в этом примере я проверяю isVisible(), прежде чем я попытался удалить диалог и проверить, является ли он нулевым, я даже попробовал с булевым набором после dialog-> reject () в конце, но ничто из этого не сработало, и я даже не уверен в причине –

+1

Вызывается ли ваш обработчик события мыши вообще, пока диалог виден? Мне кажется, что наличие модального окна предотвратит это вообще (вы можете проверить [this] (http://doc.qt.io/qt-4.8/qwidget.html#windowModality-prop) для деталей). –

+0

Так как щелчок на холсте внутри прямоугольника диалогового окна невозможно, я уменьшил свой код до этого: void Класс :: mousePressEvent (событие QMouseEvent *) { if (event-> button() == Qt :: LeftButton) { if (! Dialog-> isVisible()) { dialog-> setModal (false); dialog-> setVisible (true); } else { dialog-> setVisible (false); } } } Но как-то isVisible всегда возвращает false (и показано диалоговое окно). Зачем? –

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