最大化和最小化未停靠的 QDockWidget 中的按钮
Maximize and minimize buttons in an undocked QDockWidget
我一直在尝试将按钮添加到未停靠的 QDockWidget window,就像我通常对 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 Studio 2015年,
Qt 5.7.1,
C++
恐怕你不能那样做,因为 QDockWidget 外观基本上硬编码在你的应用程序使用的 QStyle 中,如文档中所述("Appearance" 部分中的 here)。基本上,QDockWidget 是 borderless window,标题栏及其结构(标题、按钮等)只是使用样式绘制。
为了克服这个问题,您可以使用 QProxyStyle 来绘制最小化和最大化按钮,但这些不会是 "real" 按钮,而只是它们的像素图。因此,您仍然需要进行一些修改来处理对这些虚拟按钮的点击(例如,捕获标题栏上的点击事件并确定它是否发生在这些按钮之一内)。
另一个可能的解决方案是子类化 QDockWidget 并在那里实现所有的绘画和点击事件处理。请注意,如果您想支持多个平台,您可能需要使用 QStyle::drawControl() 来绘制额外的按钮,而不是自己绘制所有内容(例如绘制像素图)。
希望对您有所帮助。祝你的项目好运。
我知道怎么做了。您必须连接到 QDockWidget toplevelChanged(bool) 信号。
connect(ui.dockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(dockWidget_topLevelChanged(bool)));
然后你需要检查它是否浮动并设置window提示。
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();
}
}
我一直在尝试将按钮添加到未停靠的 QDockWidget window,就像我通常对 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 Studio 2015年, Qt 5.7.1, C++
恐怕你不能那样做,因为 QDockWidget 外观基本上硬编码在你的应用程序使用的 QStyle 中,如文档中所述("Appearance" 部分中的 here)。基本上,QDockWidget 是 borderless window,标题栏及其结构(标题、按钮等)只是使用样式绘制。
为了克服这个问题,您可以使用 QProxyStyle 来绘制最小化和最大化按钮,但这些不会是 "real" 按钮,而只是它们的像素图。因此,您仍然需要进行一些修改来处理对这些虚拟按钮的点击(例如,捕获标题栏上的点击事件并确定它是否发生在这些按钮之一内)。
另一个可能的解决方案是子类化 QDockWidget 并在那里实现所有的绘画和点击事件处理。请注意,如果您想支持多个平台,您可能需要使用 QStyle::drawControl() 来绘制额外的按钮,而不是自己绘制所有内容(例如绘制像素图)。
希望对您有所帮助。祝你的项目好运。
我知道怎么做了。您必须连接到 QDockWidget toplevelChanged(bool) 信号。
connect(ui.dockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(dockWidget_topLevelChanged(bool)));
然后你需要检查它是否浮动并设置window提示。
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();
}
}