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