0

我有一个类,它的子类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,我再次在 dialog.reject() 之后将其设置为 false在最后一个如果,但我开始认为,.reject() 之后没有任何效果。我该如何进行?

4

2 回答 2

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;
        }
    }
}
于 2015-04-23T15:30:52.887 回答
1

我的理解是 dialog->rect() 没有给你你想要的(见这个)。不幸的是,我现在无法对其进行测试,但我认为您应该尝试将它与pos结合使用或尝试直接使用frameGeometry。有了这个,您将获得窗口相对于其父级的实际位置和大小。尝试查看您从单击事件中获得的坐标值以及从这些方法中获得的值,以便准确了解如何使用它们......基本上,您需要决定是否使用相对于您的桌面的全局坐标父窗口。

于 2015-04-23T07:19:12.430 回答