编辑和一些自我批判我尝试了两个解决方案,这都解决了我的问题,因此,我感谢你们两个!我将透明解决方案标记为已被接受,因为我认为当我只有一个子小部件时,它是最简单的实现,但我希望与其他初学者分享一些见解:
我首先使用了QLabel,它默认启用了Qt::WA_TransparentForMouseEvents,因此显然有效,但我也希望通过使用QPlainTextEdit来选择文本。可笑的是,这是不可能的,因为如果您尝试选择文本(通过单击),您将关闭窗口!最后,我保持了透明性,忽略了选择文本的功能。
我猜我下面的问题已经在某个地方被回答了,但是经过一个小时的搜索,我现在自己发了这个问题。如果有人能告诉我一个已经解答了我问题的问题,我很感激。
无论如何,我使用C++和Qt创建了一个弹出窗口。我已经创建了下面的PopupDialog类,它可以很好地满足所有的目的。但是,我已经删除了它的框架(包括包含“关闭”按钮和“窗口”标题的栏),以使其看起来更简约,现在如果用户在弹出窗口(对话框)中的任何地方按/释放鼠标按钮,我希望它关闭。
然而,以下代码的工作方式是这样的:我必须在QDialog窗口本身准确地单击并释放鼠标。如果鼠标悬停在QDialog内的子小部件上,例如显示文本的QPlainTextEdit,它将不会关闭。
因此,我需要为QDialog QMouseEvents 提供一个解决方案,以便在其子部件中识别QMouseEvents。请不要犹豫,问一下是否有什么不清楚。我没有包含我的mainwindow.h/..cpp文件,或者popupdialog.ui文件,因为我认为在这里发布它有点太过了,但是.ui非常简单:只包含一个QBoxLayout的QDialog窗口,包含一个小部件,一个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();
}发布于 2017-01-09 15:04:15
正如您已经注意到的,鼠标事件是从子部件处理的,如果不被接受,则传播到父部件。您可以阅读更多关于它的这里。
要关闭弹出窗口,当单击是在子小部件内完成时,您可以做两件事。您可以尝试查看installEventFilter并在每个子部件上设置它以调用close()。
另一个选项将要求您拥有一种centralWidget (就像MainWindow通常有的那样)--只对所有子部件进行分组。通过这种方式,您可以调用它上的setAttribute()来设置Qt::WA_TransparentForMouseEvents属性,只需跳过处理小部件及其所有子部件上的鼠标事件。
groupWidget->setAttribute(Qt::WA_TransparentForMouseEvents);根据Qt文档:
启用后,此属性将禁用将鼠标事件传递给小部件及其子部件。鼠标事件被传递到其他小部件,就好像小部件及其子部件在小部件层次结构中不存在一样;鼠标单击和其他事件有效地“通过”它们。默认情况下禁用此属性。
这基本上意味着事件将沿着链传递到第一个可以处理事件的小部件。在您的情况下,这将是PopupDialog和已经超过的mouseReleaseEvent插槽。
发布于 2017-01-09 15:03:38
在头文件中
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();
}
}https://stackoverflow.com/questions/41549207
复制相似问题