在QMainWindow Qt5.7中强制选项卡式基座

时间:2017-01-15 17:03:26

标签: c++ qt

我正在尝试让我的QMainWindow只允许选项卡式QDockWidgets。如果我理解Qt文档,它应该使用setDockOptions-method。

以下代码对我不起作用:

 QMainWindow window;
 window.setDockOptions(QMainWindow::ForceTabbedDocks);

我做错了什么?或者它是当前Qt版本中的错误?我在MacPro上进行编码,我使用的是Qt 5.7。

感谢

2 个答案:

答案 0 :(得分:3)

ForceTabbedDocks仅适用于与停靠栏的用户互动。

要在选项卡中以编程方式添加新停靠栏,您需要使用QMainWindow::tabifyDockWidgets。例如,

void MainWindow::addTabbedDock(Qt::DockWidgetArea area, QDockWidget *widget)
{
    QList<QDockWidget*> allDockWidgets = findChildren<QDockWidget*>();
    QVector<QDockWidget*> areaDockWidgets;
    for(QDockWidget *w : allDockWidgets) {
        if(dockWidgetArea(w) == area) {
            areaDockWidgets.append(w);
        }
    }

    if(areaDockWidgets.empty()) {
        // no other widgets
        addDockWidget(area, widget);
    } else {
        tabifyDockWidget(areaDockWidgets.last(), widget);
    }
}

答案 1 :(得分:0)

这与@Xian Nox 的答案相同,但适用于 python:

def addTabbedDock(self, area: QtCore.Qt.DockWidgetArea, dockwidget: QtWidgets.QDockWidget):
  curAreaWidgets = [d for d in self.findChildren(QtWidgets.QDockWidget)
                    if self.dockWidgetArea(d) == area]
  try:
    self.tabifyDockWidget(curAreaWidgets[-1], dockwidget)
  except IndexError:
    # First dock in area
    self.addDockWidget(area, dockwidget)