qt - 在Qt中创建一个没有阴影的弹出窗口

标签 qt popup popupwindow

我正在使用 Qt 4.5 开发一个应用程序(在 Windows Vista 下,但希望它是跨平台的)。我正在使用 C++

我想创建一个包含 QLineEdit 小部件的弹出窗口,其功能是当用户与 QLineEdit 小部件交互时,弹出窗口不会激活(主应用程序窗口保持事件状态)。

使用 Qt::Popup | 创建窗口(小部件) Qt::Window flags 给了我我想要的东西,除了我不想要它提供的 3D 阴影边框效果。我想要一个无边框的窗口。请注意,Qt::FramelessWindowHint 标志无法实现此目的。

有人有任何线索吗?

进一步说明:下面是一个简单测试应用程序的片段,该应用程序创建一个带有按钮的窗口。按下按钮时,将显示一个弹出窗口,用户可以在 QLineEdit 框中键入内容。当用户执行此操作时,主窗口保持激活状态:

http://howlettresearch.com/popup_img_1.png

但是,请注意弹出窗口上的阴影边框(我一直无法摆脱它)。

相比之下,按照注释掉的行创建窗口可以创建没有阴影的弹出式窗口,但是当用户单击弹出窗口中的 QLineEdit 时,主窗口不再处于事件状态。您可以看出,因为主窗口上的阴影已发生变化。

http://howlettresearch.com/popup_img_2.png

我真的很想要一个弹出窗口,它的行为就像主窗口的一部分一样。附带说明一下,当在弹出窗口外部单击时,弹出窗口会消失,但这几乎是我想要的行为,我可以使用它并抓取鼠标等来完成我想要的操作...只要我可以摆脱那个阴影!

PopupTest::PopupTest(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    QPushButton* pb = new QPushButton("test button");
    setCentralWidget(pb);
    QObject::connect(pb, SIGNAL(clicked()), this, SLOT(handleClick()));
}

void PopupTest::handleClick()
{
    //QFrame* popup1 = new QFrame(this, Qt::Tool | Qt::Window | Qt::FramelessWindowHint);
    QFrame* popup1 = new QFrame(this, Qt::Popup | Qt::Window );
    popup1->resize(150,100);
    QLineEdit *tmpE = new QLineEdit( popup1 );
    connect( tmpE, SIGNAL( returnPressed() ), popup1, SLOT( hide() ) );
    tmpE->setGeometry(10,10, 130, 30);
    tmpE->setFocus();
    popup1->show();
}

PopupTest::~PopupTest()
{

}

最佳答案

我为之前发布的问题找到了解决方案。

首先,可以通过从带有标志 Qt::Window | 的 QWidget 派生来创建弹出窗口小部件。 Qt::FramelessWindowHint。我实际上破解了 qwidget_win.cpp 以确保我的窗口具有与 WPF 提供的 Popup 控件相同的样式和扩展样式(分别为 0x96000000 和 0x08000088),如使用 Spy++ 确定的,但我不认为应该很重要。

设置窗口样式并不能解决窗口激活问题。这样做的关键是拦截通知主窗口其非客户区应该更新的 Windows 消息(WM_NCACTIVATE 消息)。这可以通过提供 QApplication::winEventFilter(MSG* msg, long* result) 的自定义实现来完成。

不幸的是,仅仅吃掉不活动的 WM_ NCACTIVATE 消息是不够的,因为它似乎阻止 WM_ACTIVATE 和其他消息发送到弹出窗口。为了解决这个问题,我进行了一个概念验证,在捕获适当的 WM_NCACTIVATE 消息后,我在 winEventFilter 中生成所需的 Windows 消息。

从这里开始,需要处理一些细节以确保它的健壮性(我想到了拦截WM_ACTIVATEAPP),然后将其包装成漂亮且可重用的东西。

当然,所有这些都是 Windows 特定的,有趣的是看看 Linux 下是否存在问题。

这一切都有点痛苦。希望我没有错过一些明显的事情......

关于qt - 在Qt中创建一个没有阴影的弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1060819/

相关文章:

c++ - qDeleteAll 和 new[]

facebook - 使用框计数布局使 Facebook 赞按钮评论弹出窗口锚定在右侧

Javascript 弹出窗口每次页面加载仅弹出一次

visual-studio - 从 Qt SDK 包管理器为 Visual Studio 安装 Qt 插件

c++ - 交叉编译qt(linux/mingw -> windows): various undefined references

java - 单击时如何复制 SmartGWT 悬停文本的外观/功能

javascript - 单击 Bootstrap 弹出窗口无任何操作

跨多个 Activity 的类似 Android Toast 的对话框

javascript - 在 Firefox 中捕获弹出窗口并通知用户

c++ - 无法使用 fixup_bundle() 与 Qt 创建可移植包