我有一个类,该子类QDialog
没有覆盖exec()
,accept()
或reject()
和另一个,它调用其Dialog
类{ {1}}:
mousePaintEvent
我已经尝试使用Dialog存在进行检查,但是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.reject()之后),我甚至尝试使用bool,我再次设置在最后一次if中的dialog.reject()之后为false,但我开始认为,在.reject()之后没有任何作用。我该怎么办?
答案 0 :(得分:1)
我的理解是dialog-> rect()没有给你你想要的东西(见this)。不幸的是我现在无法测试它,但我认为您应该尝试将其与pos结合使用,或者尝试直接使用frameGeometry。有了这个,您将获得窗口相对于其父级的实际位置和大小。尝试查看您从click事件获取的值以及这些方法中的值以确定如何使用它们...基本上您需要决定是否使用相对于您的桌面的全局坐标父窗口。
答案 1 :(得分:1)
isVisible总是返回false的问题是由于它只返回true,如果所有的祖先都是可见的,如下所示: http://doc.qt.io/qt-5/qwidget.html#visible-prop 我没有理解的是为什么有些祖先(这个类是从QDesigner添加的QTabWidget的QWidget子项的子代)不会被标记为可见,因为它们是在屏幕上绘制的。我没有得到isVisible来显示小部件是否确实可见(实际上是这样)但我使用经典的布尔方法应用了一个解决方法:
void Class::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton){
if (!dialogOpened){
dialog->show();
dialogOpened = true;
} else {
dialog->hide();
dialogOpened = false;
}
}
}