我们使用Qt 5开发了一个便携式应用程序,我正在寻找一种方法来强制停靠区域中多个QDockWidgets的顺序。例如,有两个可停靠的小部件A和B,我想要以下行为:
我希望保留顺序:如果小部件B被用户取消停靠和重新锁定,它只能发生在小部件A的右侧。
有可能吗?我无法找到任何类似功能的参考。
答案 0 :(得分:1)
AFAIK 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();
}
这种方式看起来很丑陋并且充满了变通方法。但我不知道更好的方式。
我花了很多时间来做这件事,我的建议是放弃这个想法。也许在一个码头中安装两列小部件更容易?