如何在任务栏中显示QDockWidget?

时间:2017-06-22 18:56:27

标签: qt qmainwindow qdockwidget

我使用了一个QDockWidget的子类。 " topLevelChanged"信号连接到该成员插槽:

void MyDockWidget::updateWindowFlags(bool topLevel)
{
    if (topLevel == true)
    {
        setWindowFlags(Qt::Dialog|Qt::CustomizeWindowHint|Qt::WindowTitleHint|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint);

        // "setWindowFlags" hides the widget, show it again
        show();
    }
}

这很好用(至少在Windows上,这是我的目标)并显示"最大化"标题栏中的按钮。

现在我想让Dock小部件表现得像一个"顶级"小部件:并不总是在主窗口的顶部,而是出现在任务栏中。

我试图:

  • 将Dock小部件从主窗口分离时重新显示为NULL
  • 从主窗口重新附加停靠窗口小部件时,将其重新附加到上一个父窗口

但仍然存在一些问题:用户无法再使用“拖放”功能将停靠点重新连接到主窗口。

我认为这是因为父级是NULL,因此停靠小部件不知道应该在拖动时重新附加的位置。

是否有任何方法可以获得所需的行为(停靠窗口小部件并不总是在顶部并显示在任务栏中)而无需将其重新设置为NULL?玩一些旗帜?

或者,当它的父元素设置为NULL时,是否有Dock小部件正常运行?

由于

2 个答案:

答案 0 :(得分:1)

您可以设置Windows EX样式WS_EX_APPWINDOW:

#ifdef Q_OS_WIN32
#include "qt_windows.h"
#ifdef _MSC_VER
    #pragma comment(lib,"user32.lib")
#endif
// MinGW: add >>LIBS += -lUser32<< to .pro file.
void makeWidgetApearInWindowsTaskbar(QWidget* widget) {
    HWND id = HWND(widget->winId());

    ::ShowWindow(id, SW_HIDE);
    ::SetWindowLong(id, GWL_EXSTYLE, GetWindowLong(id, GWL_EXSTYLE) | WS_EX_APPWINDOW);
    ::ShowWindow(id, SW_SHOW);
}
#endif

答案 1 :(得分:0)

至少在Linux(Mint / Cinnamon)和Qt 5.15上,有一种解决方案可以满足大多数要求,甚至看起来很可移植。

就像上面一样,将QDockWidget的“ topLevelChanged”信号连接到插槽:

void MyClass::dockSetWinFlags(bool detached)
{
    if (detached) {
         dock->setWindowFlags(Qt::CustomizeWindowHint |
                        Qt::Window | 
                        Qt::WindowMinimizeButtonHint |
                        Qt::WindowMaximizeButtonHint |
                        Qt::WindowCloseButtonHint);
         dock->show();
     }
} 

重要的区别是Qt :: Window标志而不是Qt :: Dialog。 现在,停靠栏变为带有标题栏和“最小/最大/关闭”按钮的全顶窗口,因此它不再位于主窗口的顶部,并且也显示在桌面任务栏中。

唯一不起作用的是将其拖放回主窗口,但是另一种方法-单击“浮动”按钮-仍然有效。