2017-01-09 27 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(); 
} 
} 
相關問題