我一直试图将这些按钮添加到非停靠的QDockWidget窗口中,就像通常对QDialog所做的那样,但没有成功,如下所示:
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++
发布于 2018-05-28 11:43:25
我想出了怎么做。您必须连接到QDockWidget toplevelChanged(bool)信号。
connect(ui.dockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(dockWidget_topLevelChanged(bool)));然后,您需要检查它是否浮动并设置窗口提示。
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();
}
}发布于 2018-05-25 15:04:31
恐怕您不能这样做,因为QDockWidget外观和感觉在应用程序使用的QStyle中本质上是硬编码的,如文档(在“外观”部分中的这里)中所述。基本上,QDockWidget是一个无边界窗口,标题栏及其结构(标题、按钮等)只是使用这种样式绘制的。
为了克服这一点,您可以使用QProxyStyle来绘制最小化和最大化按钮,但是这些按钮不是“真实的”按钮,而是它们的像素映射。因此,您仍然需要执行一些修改来处理对这些虚拟按钮的单击(例如,捕捉标题栏上的click事件并确定它是否发生在其中一个按钮中)。
另一个可能的解决方案是子类QDockWidget并实现所有绘制,然后单击那里的事件处理。注意,如果您想支持多个平台,您可能需要使用QStyle::drawControl()来绘制额外的按钮,而不是自己绘制所有东西(例如绘制一个像素映射)。
希望这能帮到你。祝你的项目好运。
https://stackoverflow.com/questions/50531257
复制相似问题