如何识别子窗口小部件中的QMouseEvent?

时间:2017-01-09 13:31:31

标签: c++ qt qmouseevent

编辑和一些自我批评 我试过两个给定的解决方案,这两个解决了我的问题,因此我感谢你们两个!我将透明解决方案标记为已接受,因为当我只有一个子窗口小部件时,我认为这是最简单的实现,但我希望与其他初学者分享一些见解:

我首先使用了QLabel,默认情况下显然启用了Qt::WA_TransparentForMouseEvents因此显然有效,但我也希望通过使用QPlainTextEdit来选择文本。 Laughably,这是不可能的,因为如果您尝试选择文本(通过点击),您将关闭窗口!我最终保持了透明度,忽略了选择文本功能。

我猜我以前的问题已在某处得到解答,但经过一个小时的搜索,我现在自己发布了这个问题。如果有人能指出我已经回答的问题解决了我的问题,我感激不尽。

无论如何,我正在使用C ++和Qt创建一个弹出窗口。我创建了以下PopupDialog课程,该课程适用于所有目的。但是,我已经删除了它的框架(包括包含关闭按钮和窗口标题的栏)以使其看起来简约,现在如果用户在弹出窗口内的任何位置按下/释放鼠标按钮,我希望它关闭(对话框)。

以下代码有效,但是我必须在QDialog窗口本身完全单击并释放鼠标。如果鼠标悬停在QDialog内的子窗口小部件上,则单击时不会关闭,例如一个QPlainTextEdit,显示文字。

因此,我需要QDialog的解决方案来识别其子窗口小部件中的QMouseEvents 。如果有什么不清楚的地方,请不要犹豫。我没有包含我的mainwindow.h / .cpp文件或popupdialog.ui文件,因为我认为在这里发帖会有点太多,但.ui非常简单:只有{{1}窗口持有QDialog,包含一个小部件,QBoxLayout。如果有帮助,我可以根据要求发布这些内容。

QPlainTextEdit

...

    // popupdialog.h

    #ifndef POPUPDIALOG_H
    #define POPUPDIALOG_H

    #include <QDialog>
    #include <QString>

    namespace Ui {class PopupDialog;}

    class PopupDialog : public QDialog
    {
            Q_OBJECT

    public:
            explicit PopupDialog(QWidget *parent = 0, QString msgTxt="");
            ~PopupDialog();

    private:
            Ui::PopupDialog *ui;
            QString messageText;
            void mouseReleaseEvent(QMouseEvent*);
    };

    #endif //POPUPDIALOG_H

2 个答案:

答案 0 :(得分:2)

正如您已经注意到,鼠标事件是从子窗口小部件处理的,如果不被接受则传播给父窗口。您可以阅读更多相关信息here

要在子窗口小部件内完成单击后关闭弹出窗口,您可以执行两项操作。您可以尝试查看installEventFilter并在每个子窗口小部件上设置它以致电close()

另一个选项要求你有一种centralWidget(就像MainWindow通常有的那样) - 只是为你的所有子窗口小部件组合。通过这种方式,您可以在其上调用setAttribute()来设置Qt::WA_TransparentForMouseEvents属性,以便简单地跳过在窗口小部件及其所有子窗口上处理鼠标事件。

groupWidget->setAttribute(Qt::WA_TransparentForMouseEvents);

根据Qt文档:

  

启用后,此属性将禁用鼠标事件的传递   小部件及其子代。鼠标事件将传递给其他人   小部件,好像小部件及其子节点不在   小部件层次;鼠标点击和其他事件有效地传递   通过&#34;他们。默认情况下禁用此属性。

这基本上意味着事件将链传递到第一个可以处理事件的小部件。在您的情况下,它将是PopupDialog和已经覆盖的mouseReleaseEvent广告位。

答案 1 :(得分:1)

头文件中的

class PopupDialog : public QDialog
{
        Q_OBJECT

public:
        explicit PopupDialog(QWidget *parent = 0, QString msgTxt="");
        ~PopupDialog();

//////////////////////////////////
protected:
bool eventFilter(QObject *obj, QEvent *event);

//////////////////////////////////////

private:
        Ui::PopupDialog *ui;
        QString messageText;
        void mouseReleaseEvent(QMouseEvent*);
};

in cpp

 PopupDialog::PopupDialog(QWidget *parent, QString msgTxt) :
        QDialog(parent),
        ui(new Ui::PopupDialog),
        messageText(msgTxt)
{
        ui->setupUi(this);
        setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
        setModal(true);
        ui->message_text_display->setText(messageText);
        // The message_text_display is an instance of the class,
        // "PlainTextEdit". Using "QLabel" partly solves my
        // problem, but does not allow text selection.
///////////////////////////////////////
  foreach (QObject *child, children())
{
    child->installEventFilter(this);
}
///////////////////////////////////////
}


///////////////////////////////////////
bool PopupDialog::eventFilter(QObject *obj, QEvent *event)
{

if(event->type() == QEvent::MouseButtonRelease)
{
this->close();
}
}