如何做一个QDockWidget出现在任务栏上?(How to made a QDockWidget

2019-09-29 22:57发布

我用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上,这是我的目标),并显示在标题栏显示“最大化”按钮。

现在,我想使码头部件表现得像一个“顶级”窗口小部件:不是始终在主窗口的顶部,并出现在任务栏上。

我试着:

  • 重新设置父级船坞部件为NULL当它从主窗口中分离
  • 重新设置父级坞插件先前父当它从主窗口重新附

但仍然有一些问题:用户不能使用拖放了被告席重新连接到主窗口。

我想这是因为父是空的,所以停靠小部件不知道它应该在拖放重新连接。

有没有什么办法有期望的行为(基座部件不是总在最前面,并显示在任务栏),而无需重新养育为NULL? 有一些标志玩?

或者,反正是有有码头窗口小部件时其父被设置为NULL,以正确的行为?

谢谢

Answer 1:

您可以设置窗口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


文章来源: How to made a QDockWidget appears in taskbar?