首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最大化和最小化未停靠的QDockWidget中的按钮

最大化和最小化未停靠的QDockWidget中的按钮
EN

Stack Overflow用户
提问于 2018-05-25 14:16:49
回答 2查看 3.7K关注 0票数 5

我一直试图将这些按钮添加到非停靠的QDockWidget窗口中,就像通常对QDialog所做的那样,但没有成功,如下所示:

代码语言:javascript
复制
QDockWidget* dw = new QDockWidget(QString("Stream %1").arg(i + 1), this); 
dw->setWindowFlags((dw->windowFlags() | Qt::WindowMaximizeButtonHint |
    Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint));

当我解开他们,他们仍然只有X关闭按钮。

我遗漏了什么?

开发环境信息: Windows 10 x64,Visual 2015,Qt 5.7.1,C++

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-28 11:43:25

我想出了怎么做。您必须连接到QDockWidget toplevelChanged(bool)信号。

代码语言:javascript
复制
connect(ui.dockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(dockWidget_topLevelChanged(bool)));

然后,您需要检查它是否浮动并设置窗口提示。

代码语言:javascript
复制
void MyClass::dockWidget_topLevelChanged(bool)
{
    QDockWidget* dw = static_cast<QDockWidget*>(QObject::sender());
    if (dw->isFloating())
    {
        dw->setWindowFlags(Qt::CustomizeWindowHint |
            Qt::Window | Qt::WindowMinimizeButtonHint |
            Qt::WindowMaximizeButtonHint |
            Qt::WindowCloseButtonHint);
        dw->show();
    }
}
票数 11
EN

Stack Overflow用户

发布于 2018-05-25 15:04:31

恐怕您不能这样做,因为QDockWidget外观和感觉在应用程序使用的QStyle中本质上是硬编码的,如文档(在“外观”部分中的这里)中所述。基本上,QDockWidget是一个无边界窗口,标题栏及其结构(标题、按钮等)只是使用这种样式绘制的。

为了克服这一点,您可以使用QProxyStyle来绘制最小化和最大化按钮,但是这些按钮不是“真实的”按钮,而是它们的像素映射。因此,您仍然需要执行一些修改来处理对这些虚拟按钮的单击(例如,捕捉标题栏上的click事件并确定它是否发生在其中一个按钮中)。

另一个可能的解决方案是子类QDockWidget并实现所有绘制,然后单击那里的事件处理。注意,如果您想支持多个平台,您可能需要使用QStyle::drawControl()来绘制额外的按钮,而不是自己绘制所有东西(例如绘制一个像素映射)。

希望这能帮到你。祝你的项目好运。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50531257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档