Использование QDialog внутри MousePressEvent

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

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();
}
}
}

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

0

Решение

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

1

Другие решения

Проблема с тем, что isVisible всегда возвращает false, была вызвана тем, что он возвращал true, только если все предки видимы, как указано здесь:
http://doc.qt.io/qt-5/qwidget.html#visible-prop
Я не могу понять, почему некоторые из предков (класс является дочерним по отношению к дочернему элементу QWidget 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

По вопросам рекламы [email protected]