python - 读取 UI 文件并连接按钮、文本等元素

标签 python qt-designer pyside2

我正在考虑使用 PySide2,但读取 UI 文件,而不是通过 pyside2-uic 生成 Python。奇怪的是,我似乎找不到这种简单连接的示例。

我看到了 PyQt5 和 PySide2 之间的区别:

https://www.learnpyqt.com/blog/pyqt5-vs-pyside2/

但我不清楚如何使用 PySide2 连接按钮。

打开窗口的最简单的代码在这里;我不太明白的是连接到 UI 中创建的元素(btnTest)的位。我已经让这些东西可以与 Qt 一起使用,但语法让我困惑。一旦弄清楚了这一点,剩下的就应该水到渠成了。

import sys
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import (QToolTip, QMessageBox, QPushButton, \
QApplication, QCheckBox, QDialog, QFileDialog, QGraphicsScene, QWidget, \
QLabel,QMainWindow, QDialogButtonBox)

'''

button hookup is here

'''



if __name__ == '__main__':
    print("Program start.")
    loader = QUiLoader()
    app = QtWidgets.QApplication(sys.argv)
    window = loader.load("test.ui", None)
    window.show()
    app.exec_()

以及按钮的 XML(.ui 文件):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>210</width>
    <height>117</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="btnTest">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>30</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>210</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

我见过这样的结构,但不太确定我错过了什么;最初的答案让我继续前进,但我认为还有一种更Pythonic的做事方式。需要明确的是 - 以下内容不起作用(给出的解决方案有效);我试图模仿如何设置包含转换后的 .uic 文件中的 .py 文件。

class Form(QMainWindow):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.btnTest.clicked.connect(ProcessClick)

    def ProcessClick(self):
        print("hi")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Form()
    loader = QUiLoader()
    window = loader.load("test.ui", None)
    window.show()
    app.exec_()

最佳答案

根据 XML,按钮名称为 btnTest:

<widget class="QPushButton" name="btnTest">

因此您必须使用该名称才能访问该按钮:

import sys

from PySide2 import QtWidgets, QtUiTools


if __name__ == "__main__":
    print("Program start.")

    app = QtWidgets.QApplication(sys.argv)
    loader = QtUiTools.QUiLoader()
    window = loader.load("test.ui", None)

    window.btnTest.clicked.connect(lambda: print("clicked"))

    window.show()
    sys.exit(app.exec_())

关于python - 读取 UI 文件并连接按钮、文本等元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61882731/

相关文章:

Python Twitter JSON 无法提取位置、地点或时区

python - 如果模板丢失,错误消息会更好

qt - pyqtgraph 绘图未填充整个小部件(来自 qt 设计器)

python - 如何在没有 QWidget 的情况下使用 TabWidget 启动项目

python - 根据来自 QComboBox 的用户输入添加和删除动态生成的 QLineEdit 小部件

python - QListWidget:如何拖放插入带有图标的自定义小部件?

带有列表的 Python 实例行为

python - 向下传递参数的递归函数

python - 如何创建信号以在 Qt Designer 中打开 QFileDialog?

python - 重建一扇 window