【问题标题】:Using QDialog inside MousePressEvent在 MousePressEvent 中使用 QDialog
【发布时间】:2015-04-22 13:17:09
【问题描述】:

我有一个类,它是 QDialog 的子类,而不覆盖 exec()accept()reject() 以及另一个类,它在其 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();
        }
    }
}

我尝试使用对话框的存在性进行检查,但delete 并没有真正起作用(我将它放在 dialog.reject() 之后),我什至尝试使用布尔值,我再次将其设置为 false在最后一个 if 中的 dialog.reject() 之后,但我开始认为,在 .reject() 之后没有任何作用。我该如何进行?

【问题讨论】:

  • 从高层次上讲,您实际上想做什么?
  • 这是“Canvas”(QOpenGlWidget)的绘制事件。我想要做的是在鼠标左键单击时打开一个对话框,我可以从中选择要在画布上绘制的内容,并且,当对话框打开时,我希望能够通过单击它外部来关闭它。

标签: c++ qt qdialog qmouseevent


【解决方案1】:

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

【讨论】:

  • 虽然这确实有帮助,但我知道我没有正确地提出这个问题。这是关于我如何检查对话框是否存在,在这个例子中我正在检查 isVisible(),在此之前我尝试删除对话框并检查它是否为空,我什至尝试在 dialog->reject( ) 最后,但这些都不起作用,我什至不确定原因
  • 当对话框可见时,您的鼠标事件处理程序是否会被调用?在我看来,拥有一个模态窗口将完全防止这种情况发生(您可以查看this了解详细信息)。
  • 由于单击对话框矩形内的画布是不可能的,我将代码简化为: void Class::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt: :LeftButton){ if (!dialog->isVisible()){ dialog->setModal(false);对话框->setVisible(true); } else { 对话框->setVisible(false);但不知何故 isVisible 总是返回 false (并显示对话框)。为什么?
  • dialog->isVisible() 设置为 true 后是否立即返回 false?我想你已经离开了setVisibleisVisibleshowhide的默认实现?
  • 是的,一切都失败了,因为层次结构中的某些东西似乎不可见,尽管我看到了。我猜对了,所以我将其作为答案发布。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多