最大化和最小化未对接的QDockWidget中的按钮

时间:2018-05-25 14:16:50

标签: c++ qt qt5

我一直在尝试将按钮添加到未停靠的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 Studio 2015, Qt 5.7.1, C ++

2 个答案:

答案 0 :(得分:5)

我想出了怎么做。你必须连接到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();
    }
}

答案 1 :(得分:1)

我担心你不能这样做,因为 QDockWidget 的外观和感觉基本上是在你的应用程序使用的QStyle中硬编码的,正如documnetation中所述({{3}在“外观”部分)。基本上,QDockWidget是一个无边框窗口,标题栏及其结构(标题,按钮等)只是使用样式绘制的。

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

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

我希望这会对你有所帮助。祝你的项目好运。