編輯和一些自我批判 我嘗試了兩個給出的解決方案,這兩個解決方案都解決了我的問題,因此我都謝謝你們!我標誌着透明的溶液,作爲接受,因爲我認爲這是是最容易實現的時候我只有一個子控件,但我想分享一些見解其他初學者:如何識別子窗口小部件中的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();
}
你試過重新實現mousePressEvent()事件處理程序嗎? – ramzes2
@ ramzes2不,我沒有。我會怎麼做?讓子部件的mousePressEvent處理程序返回它的父指針呢?你有(鏈接到)一個很好的例子嗎? – magnus
我想你可能要找的是Qt的事件過濾機制,如本文所述:http://www.informit.com/articles/article.aspx?p=1405544&seqNum=2 –