2017-01-09 26 views
0

编辑和一些自我批判 我尝试了两个给出的解决方案,这两个解决方案都解决了我的问题,因此我都谢谢你们!我标志着透明的溶液,作为接受,因为我认为这是是最容易实现的时候我只有一个子控件,但我想分享一些见解其他初学者:如何识别子窗口小部件中的QMouseEvent?

我第一次使用QLabel,这apperently已经启用Qt::WA_TransparentForMouseEvents默认,因此显然工作,但我也希望文本是可选的,通过使用QPlainTextEdit来代替。可笑的是,这是不可能的,因为如果你尝试选择文本(点击)你会关闭窗口!我最终保持了透明度,忽略了选择文本功能。


我猜我的以下问题已经在什么地方回答,但搜索我现在张贴自己的问题的一个小时之后。我很感激,如果有人能指出我已经回答的问题,解决我的问题。

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

下面的代码起作用,但是我必须在QDialog窗口本身点击并释放鼠标。如果鼠标悬停在QDialog内部的子窗口小部件上,我点击时它将不会关闭。一个QPlainTextEdit,它正在显示文本。

因此,我需要QDialog的解决方案来识别QMouseEvents其子窗口小部件。请不要犹豫,询问是否有什么不清楚的地方。我没有包含我的mainwindow.h/.cpp文件,或者popupdialog.ui文件,因为我相信在这里发布会有点过分,但是.ui非常简单:只有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 

...

// 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(); 
    } 
+0

你试过重新实现mousePressEvent()事件处理程序吗? – ramzes2

+0

@ ramzes2不,我没有。我会怎么做?让子部件的mousePressEvent处理程序返回它的父指针呢?你有(链接到)一个很好的例子吗? – magnus

+1

我想你可能要找的是Qt的事件过滤机制,如本文所述:http://www.informit.com/articles/article.aspx?p=1405544&seqNum=2 –

回答

2

正如你已经注意到了鼠标事件从子控件处理并传播到父母如果不被接受。你可以阅读更多关于它here

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

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

groupWidget->setAttribute(Qt::WA_TransparentForMouseEvents); 

根据Qt文档:

启用后,该属性将禁用交付鼠标事件来 小部件和它的孩子。将鼠标事件传递到其他 小部件,就好像小部件及其子项不在 小部件层次结构中;鼠标点击和其他事件有效地“通过 通过”他们。该属性默认是禁用的。

这基本上意味着事情将链向上传递到可以处理该事件的第一个部件。在你的情况下,这将是PopupDialog和已覆盖mouseReleaseEvent插槽。

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

在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(); 
} 
} 
相关问题