Python Can';无法正确获取MDI选项卡顺序

Python Can';无法正确获取MDI选项卡顺序,python,pyqt,qt-designer,Python,Pyqt,Qt Designer,我正在使用QtDesigner,有一个带有两个选项卡的MDI应用程序。我似乎无法让标签按我希望的方式打开。我希望子窗口具有焦点,并在应用程序打开时成为左边的第一个窗口。因此,“子窗口_2”将位于右侧,并且在应用程序打开时不会有焦点 当应用程序打开时,我的焦点是正确的。但是账单顺序是错误的。换句话说,焦点是“子窗口”,但它显示在右侧而不是左侧 我在QtDesigner中做了很多尝试,比如在创建顺序和堆叠顺序之间更改激活顺序,但似乎没有效果。我该如何解决这个问题 import sys from Py

我正在使用QtDesigner,有一个带有两个选项卡的MDI应用程序。我似乎无法让标签按我希望的方式打开。我希望子窗口具有焦点,并在应用程序打开时成为左边的第一个窗口。因此,“子窗口_2”将位于右侧,并且在应用程序打开时不会有焦点

当应用程序打开时,我的焦点是正确的。但是账单顺序是错误的。换句话说,焦点是“子窗口”,但它显示在右侧而不是左侧

我在QtDesigner中做了很多尝试,比如在创建顺序和堆叠顺序之间更改激活顺序,但似乎没有效果。我该如何解决这个问题

import sys
from PyQt4 import QtCore, QtGui
from phreqMDI import Ui_MainWindow

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyForm,self).__init__(parent)
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)       

        self.ui.mdiArea.addSubWindow(self.ui.subwindow_2)
        self.ui.mdiArea.addSubWindow(self.ui.subwindow)

有人提到pyuic4不能很好地使用MDI。也许我需要在代码中更改某些内容,而不是在QtDesigner中进行更改?

您需要按正确的选项卡顺序添加它们,然后显式激活相关子窗口:

    self.ui.mdiArea.addSubWindow(self.ui.subwindow)
    self.ui.mdiArea.addSubWindow(self.ui.subwindow_2)
    self.ui.mdiArea.setActiveSubWindow(
        self.ui.mdiArea.subWindowList()[0])
PS

由于某些原因,在
\uuuu init\uuuu
期间设置活动子窗口时,似乎有必要使用。将
addSubWindow
的返回值传递给
setActiveSubWindow
对我来说不起作用-但这可能是一个特定于平台的问题(我在Linux上测试过)

更新

因此,假设您使用的是Windows,那么确实存在一些特定于平台的差异。作为一种解决方法,请尝试使用计时器设置活动子窗口,如下所示:

    self.ui.mdiArea.addSubWindow(self.ui.subwindow)
    self.ui.mdiArea.addSubWindow(self.ui.subwindow_2)
    QtCore.QTimer.singleShot(10,
        lambda: self.ui.mdiArea.setActiveSubWindow(
                self.ui.mdiArea.subWindowList()[0]))

我做了建议的改变。选项卡现在的顺序正确,但焦点错误。打开时,焦点在子窗口_2上,而不是子窗口上。我尝试将setActiveSubWindow语句中的索引从[0]更改为[1],以查看这是否有帮助。它什么也没做。将其设置为[2]将按预期排除一个错误。@user3720101。我已经在我的答案中添加了另一个解决方案。首先,我要感谢您的帮助。我从这些答案中学到了很多!你建议的纠正措施非常有效。这正是我想要的。在结束本文之前,我想知道我是否可以问一下为什么需要单次触发计时器。我想语句会说,等待10毫秒,然后运行setActiveWindow方法。为什么需要10毫秒的等待时间?还有,为什么需要lamda?我也想知道为什么我不能在QtDesigner中完成这项工作。这一切都回到PYUIC4和MDI上了吗?提前感谢您的支持comments@user3720101. 这是因为代码是在事件循环开始之前执行的,也是在显示所有窗口之前执行的。QTimer将单个计时器事件发送到事件队列的末尾,允许在尝试激活窗口之前处理所有当前挂起的事件。
lambda
只是一种在线定义信号处理程序的方法-如果需要,可以用专用方法替换它。这些都与pyuic无关。唯一的问题是,它不会生成用于添加子窗口的锅炉板代码。