C++ QMainWindow Qt5.7中的强制选项卡式停靠

C++ QMainWindow Qt5.7中的强制选项卡式停靠,c++,qt,C++,Qt,我正试图让我的QMainWindow只允许选项卡式QDock小部件。如果我正确理解了Qt文档,那么它应该与setDockOptions方法一起工作 以下代码对我不起作用: QMainWindow window; window.setDockOptions(QMainWindow::ForceTabbedDocks); 我做错了什么?或者它是当前Qt版本中的一个bug?我在MacPro上编码,我用的是Qt5.7 谢谢ForceTabbedDocks仅适用于用户与docks的交互 要以编程方式

我正试图让我的QMainWindow只允许选项卡式QDock小部件。如果我正确理解了Qt文档,那么它应该与setDockOptions方法一起工作

以下代码对我不起作用:

 QMainWindow window;
 window.setDockOptions(QMainWindow::ForceTabbedDocks);
我做错了什么?或者它是当前Qt版本中的一个bug?我在MacPro上编码,我用的是Qt5.7


谢谢

ForceTabbedDocks
仅适用于用户与docks的交互

要以编程方式在选项卡中添加新的停靠点,需要使用
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);
    }
}
void主窗口::addTabbedDock(Qt::DockWidgetArea,QDockWidget*小部件)
{
QList allDockWidgets=findChildren();
QVector areaDockWidgets;
对于(QDockWidget*w:AllDockWidget){
if(dockWidgetArea(w)=面积){
areaDockWidgets.append(w);
}
}
if(areaDockWidgets.empty()){
//没有其他小部件
addDockWidget(区域、小部件);
}否则{
tabifyDockWidget(areaDockWidgets.last(),小部件);
}
}

这是与@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)