c++ - 强制 QDockWidget 顺序

标签 c++ qt user-interface

我们使用 Qt 5 开发了一个可移植应用程序,我目前正在寻找一种方法来强制停靠区域中多个 QDockWidgets 的顺序。例如,对于两个可停靠小部件 A 和 B,我想要以下行为:

  • A 可以 float 或停靠在左侧
  • B 可以 float 或停靠在左侧但在 A 的右侧

而且我希望保留顺序:如果小部件 B 被用户取消停靠和重新停靠,它只能发生在小部件 A 的右侧。

这有可能吗?我找不到对此类功能的任何引用。

最佳答案

据我所知,Qt 没有这个功能。您必须通过他们的信号手动处理码头重新排列。这是一个快速示例:

#include <QtCore>
#include <QtGui>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow mainWindow;
    mainWindow.setCentralWidget(new QLabel("<B>I am a<BR>central widget.</B>"));
    QDockWidget dock1("Dock1");
    dock1.setWidget(new QLabel("Content1"));
    QDockWidget dock2("Dock2");
    dock2.setWidget(new QLabel("Content2"));
    dock2.setAllowedAreas(Qt::LeftDockWidgetArea);

    const auto relocateDock1 = [&] (Qt::DockWidgetArea newArea) {
        if (dock1.isFloating())
            return;

        if (newArea == Qt::LeftDockWidgetArea) {
            // Dock is tabified before user drops it. See also
            // QMainWindow::splitDockWidget notes in documentation.
            if (!mainWindow.tabifiedDockWidgets(&dock2).isEmpty())
                mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &dock2);
            mainWindow.splitDockWidget(&dock1, &dock2, Qt::Horizontal);
        }
    };
    const auto relocateDock2 = [&] (bool topLevel) {
        if (topLevel)
            return;

        if (mainWindow.dockWidgetArea(&dock1) == Qt::LeftDockWidgetArea) {
            mainWindow.splitDockWidget(&dock1, &dock2, Qt::Horizontal);
        }
    };
    QObject::connect(&dock1, &QDockWidget::dockLocationChanged, relocateDock1);
    QObject::connect(&dock2, &QDockWidget::topLevelChanged, relocateDock2);

    mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &dock1);
    mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &dock2);
    relocateDock2(false);

    mainWindow.show();

    return app.exec();
}

这种方式看起来很难看,而且充满了变通方法。但我不知道更好的方法。

我花了很多时间去做,我的建议是放弃这个想法。也许在一个停靠栏中有一个两列小部件更容易?

关于c++ - 强制 QDockWidget 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39741157/

相关文章:

c++ - 当涉及依赖范围的内部类时,如何使 C++ 找到模板化函数头?

c++ - qt 在 Windows 线程中发出信号

Java 布局比例 : Creating a scalable square Panel

C++ 用户界面资源

user-interface - 给定背景颜色,如何获得使其在该背景颜色上可读的前景色?

C++ 哈希表和链表问题

c++ - 调用 SetupDiGetDeviceInterfaceDetail 时程序崩溃

c++ - Qt QString.arg() 不工作

qt - 如何确定当前项目是否是 ListView 部分中的最后一项

c++ - 在不使用专用计数器的情况下检查 QTextStream 读取的总行数