将小部件从单独的 ui 文件加载到主窗口

Posted

技术标签:

【中文标题】将小部件从单独的 ui 文件加载到主窗口【英文标题】:dock widget loaded from separate ui file to main window 【发布时间】:2013-06-09 18:06:53 【问题描述】:

我正在使用 PySide 构建一个应用程序,并且希望能够从单独的 .ui 文件加载小部件。下面是我尝试过的一些代码,但它不会让我将分别从主窗口加载的停靠小部件停靠到主窗口。主窗口 ui 文件包含一个简单的主窗口和一些已经停靠在其中的项目,dock_widget ui 包含一个停靠小部件和里面的一些按钮。当我在加载后双击停靠小部件的栏时,它似乎“停靠”到什么都没有,当我将它拖到主窗口上时它不会停靠。主窗口肯定接受停靠小部件,因为其中定义了一些正常运行的小部件。

#!/usr/bin/python

# Import PySide classes
import sys
from PySide.QtGui import *
from PySide.QtCore import *
from PySide.QtUiTools import QUiLoader


def load_ui(ui_file, parent=None):
    loader = QUiLoader()
    file = QFile(ui_file)
    file.open(QFile.ReadOnly)
    myWidget = loader.load(file, None)
    myWidget.show()
    file.close()
    myWidget.show()
    return myWidget

# Create a Qt application
app = QApplication(sys.argv)


# Create a Label and show it
main_window = load_ui("ui/main_window.ui")
dock_widget = load_ui("ui/console.ui", main_window)

# Enter Qt application main loop
app.exec_()
sys.exit()

console.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>DockWidget</class>
 <widget class="QDockWidget" name="DockWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>542</width>
    <height>261</height>
   </rect>
  </property>
  <property name="contextMenuPolicy">
   <enum>Qt::DefaultContextMenu</enum>
  </property>
  <property name="windowTitle">
   <string>DockWidget</string>
  </property>
  <widget class="QWidget" name="dockWidgetContents">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QTextEdit" name="textEdit_2"/>
    </item>
    <item>
     <widget class="QTextEdit" name="textEdit"/>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

关于我应该做的不同的任何想法

【问题讨论】:

请在此处粘贴console.ui 文件。 【参考方案1】:

你不应该打电话给QDockWidget::show。这迫使它像通常的 QWidget 一样工作。请改用QMainWindow::addDockWidget

def load_ui(ui_file, parent=None):
    loader = QUiLoader()
    file = QFile(ui_file)
    file.open(QFile.ReadOnly)
    myWidget = loader.load(file, None)
    file.close()
    return myWidget

main_window = load_ui("ui/main_window.ui")
dock_widget = load_ui("ui/console.ui", main_window)
main_window.show()
main_window.addDockWidget(Qt.LeftDockWidgetArea, dock_widget)

【讨论】:

感谢这很好用,但我希望有一种方法可以将小部件初始化为撕下状态,让您可以选择稍后停靠,您知道这是否可能吗? dock_widget.setFloating(True) 可以解决问题。在此之前您仍然需要致电addDockWidget()

以上是关于将小部件从单独的 ui 文件加载到主窗口的主要内容,如果未能解决你的问题,请参考以下文章

无法将小部件 ID 传递给配置活动

从主窗口中的 UI 文件加载带有信号槽定义的小部件

如何使用 grid() 将小部件水平居中?

在多个 ui 文件之间拆分 Qt 表单

将小部件添加到地图会破坏 GWT 中的其他小部件

Qt将小部件添加到GraphicsView?