首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别子部件中的QMouseEvent?

如何识别子部件中的QMouseEvent?
EN

Stack Overflow用户
提问于 2017-01-09 13:31:31
回答 2查看 2.8K关注 0票数 1

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

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

我猜我下面的问题已经在某个地方被回答了,但是经过一个小时的搜索,我现在自己发了这个问题。如果有人能告诉我一个已经解答了我问题的问题,我很感激。

无论如何,我使用C++和Qt创建了一个弹出窗口。我已经创建了下面的PopupDialog类,它可以很好地满足所有的目的。但是,我已经删除了它的框架(包括包含“关闭”按钮和“窗口”标题的栏),以使其看起来更简约,现在如果用户在弹出窗口(对话框)中的任何地方按/释放鼠标按钮,我希望它关闭。

然而,以下代码的工作方式是这样的:我必须在QDialog窗口本身准确地单击并释放鼠标。如果鼠标悬停在QDialog内的子小部件上,例如显示文本的QPlainTextEdit,它将不会关闭。

因此,我需要为QDialog QMouseEvents 提供一个解决方案,以便在其子部件中识别QMouseEvents。请不要犹豫,问一下是否有什么不清楚。我没有包含我的mainwindow.h/..cpp文件,或者popupdialog.ui文件,因为我认为在这里发布它有点太过了,但是.ui非常简单:只包含一个QBoxLayoutQDialog窗口,包含一个小部件,一个QPlainTextEdit。如果有帮助的话,我可以按要求贴出这些。

代码语言:javascript
复制
    // 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

..。

代码语言:javascript
复制
    // popupdialog.cpp

    #include "popupdialog.h"
    #include "ui_popupdialog.h"


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

    PopupDialog::~PopupDialog()
    {
            delete ui;
    }


    void PopupDialog::mouseReleaseEvent(QMouseEvent *e)
    {
            this->close();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-09 15:04:15

正如您已经注意到的,鼠标事件是从子部件处理的,如果不被接受,则传播到父部件。您可以阅读更多关于它的这里

要关闭弹出窗口,当单击是在子小部件内完成时,您可以做两件事。您可以尝试查看installEventFilter并在每个子部件上设置它以调用close()

另一个选项将要求您拥有一种centralWidget (就像MainWindow通常有的那样)--只对所有子部件进行分组。通过这种方式,您可以调用它上的setAttribute()来设置Qt::WA_TransparentForMouseEvents属性,只需跳过处理小部件及其所有子部件上的鼠标事件。

代码语言:javascript
复制
groupWidget->setAttribute(Qt::WA_TransparentForMouseEvents);

根据Qt文档:

启用后,此属性将禁用将鼠标事件传递给小部件及其子部件。鼠标事件被传递到其他小部件,就好像小部件及其子部件在小部件层次结构中不存在一样;鼠标单击和其他事件有效地“通过”它们。默认情况下禁用此属性。

这基本上意味着事件将沿着链传递到第一个可以处理事件的小部件。在您的情况下,这将是PopupDialog和已经超过的mouseReleaseEvent插槽。

票数 2
EN

Stack Overflow用户

发布于 2017-01-09 15:03:38

在头文件中

代码语言:javascript
复制
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*);
};

在cpp中

代码语言:javascript
复制
 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();
}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41549207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档