编辑和一些自我批评 我试过两个给定的解决方案,这两个解决了我的问题,因此我感谢你们两个!我将透明解决方案标记为已接受,因为当我只有一个子窗口小部件时,我认为这是最简单的实现,但我希望与其他初学者分享一些见解:
我首先使用了QLabel
,默认情况下显然启用了Qt::WA_TransparentForMouseEvents
因此显然有效,但我也希望通过使用QPlainTextEdit
来选择文本。 Laughably,这是不可能的,因为如果您尝试选择文本(通过点击),您将关闭窗口!我最终保持了透明度,忽略了选择文本功能。
我猜我以前的问题已在某处得到解答,但经过一个小时的搜索,我现在自己发布了这个问题。如果有人能指出我已经回答的问题解决了我的问题,我感激不尽。
无论如何,我正在使用C ++和Qt创建一个弹出窗口。我创建了以下PopupDialog
课程,该课程适用于所有目的。但是,我已经删除了它的框架(包括包含关闭按钮和窗口标题的栏)以使其看起来简约,现在如果用户在弹出窗口内的任何位置按下/释放鼠标按钮,我希望它关闭(对话框)。
以下代码有效,但是我必须在QDialog窗口本身完全单击并释放鼠标。如果鼠标悬停在QDialog
内的子窗口小部件上,则单击时不会关闭,例如一个QPlainTextEdit
,显示文字。
因此,我需要QDialog
的解决方案来识别其子窗口小部件中的QMouseEvents
。如果有什么不清楚的地方,请不要犹豫。我没有包含我的mainwindow.h / .cpp文件或popupdialog.ui
文件,因为我认为在这里发帖会有点太多,但.ui
非常简单:只有{{1}窗口持有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
答案 0 :(得分:2)
正如您已经注意到,鼠标事件是从子窗口小部件处理的,如果不被接受则传播给父窗口。您可以阅读更多相关信息here
要在子窗口小部件内完成单击后关闭弹出窗口,您可以执行两项操作。您可以尝试查看installEventFilter并在每个子窗口小部件上设置它以致电close()
。
另一个选项要求你有一种centralWidget(就像MainWindow
通常有的那样) - 只是为你的所有子窗口小部件组合。通过这种方式,您可以在其上调用setAttribute()来设置Qt::WA_TransparentForMouseEvents
属性,以便简单地跳过在窗口小部件及其所有子窗口上处理鼠标事件。
groupWidget->setAttribute(Qt::WA_TransparentForMouseEvents);
根据Qt
文档:
启用后,此属性将禁用鼠标事件的传递 小部件及其子代。鼠标事件将传递给其他人 小部件,好像小部件及其子节点不在 小部件层次;鼠标点击和其他事件有效地传递 通过&#34;他们。默认情况下禁用此属性。
这基本上意味着事件将链传递到第一个可以处理事件的小部件。在您的情况下,它将是PopupDialog
和已经覆盖的mouseReleaseEvent
广告位。
答案 1 :(得分: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*);
};
in 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();
}
}