Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从主窗口的UI文件加载带有信号槽定义的小部件_Python_Pyqt_Pyqt5_Qt Designer - Fatal编程技术网

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

Python 从主窗口的UI文件加载带有信号槽定义的小部件,python,pyqt,pyqt5,qt-designer,Python,Pyqt,Pyqt5,Qt Designer,我很难将Qt Designer生成的小部件加载到我的主窗口中。当我还在UI文件中定义了信号和插槽时,它会失败 # -*- coding: utf-8 -*- import sys from PyQt5 import QtWidgets from PyQt5 import uic as pyuic class MainWindow(QtWidgets.QMainWindow): def __init__(self, *args): super().__init__(*a

我很难将Qt Designer生成的小部件加载到我的主窗口中。当我还在UI文件中定义了信号和插槽时,它会失败

# -*- coding: utf-8 -*-
import sys

from PyQt5 import QtWidgets
from PyQt5 import uic as pyuic

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args):
        super().__init__(*args)
        self.uifile = 'serialTandemGUI.ui'
        self.form_widget = pyuic.loadUi(self.uifile)
        _widget = QtWidgets.QWidget()
        _layout = QtWidgets.QVBoxLayout(_widget)
        _layout.addWidget(self.form_widget)
        self.setCentralWidget(_widget)

if __name__ == '__main__':
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    app.aboutToQuit.connect(app.deleteLater)

    w = MainWindow()
    w.show()

    app.exec_()
我得到的错误是:
AttributeError:“QWidget”对象没有属性“init”

是否有可能以这种方式继承小部件?蒂亚

编辑: 下面是一个简单的UI文件,其中有一个clicked()信号来演示。只要没有信号定义,它就可以工作(也就是说,实际上只是UI,但这只是工作的一半,甚至更少)


形式
0
0
400
300
形式
分组框
按钮
按钮
点击()
形式
init()
203
162
396
201
init()

说明:

当您创建.ui时,您只指出单击的信号与小部件的
init
方法之间存在连接,但是当您使用
loadUi()
加载它并且不将其作为第二个参数传递时,QWidget将使用设计的基类,在您的例子中,QWidget显然没有“init”方法向您抛出该错误

解决方案:

您必须创建一个继承自QWidget并具有
init
方法的类,然后使用
loadUi()
填充它

#-*-编码:utf-8-*-
导入操作系统
导入系统
从PyQt5将QtCore、QtWidgets、uic作为pyuic导入
类小部件(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
current_dir=os.path.dirname(os.path.realpath(uu文件_uu))
uifile=os.path.join(当前目录,“serialTandemGUI.ui”)
loadUi(uifile,self)
@QtCore.pyqtSlot()
def初始化(自):
打印(“初始化”)
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.form_widget=widget()
_widget=qtwidts.QWidget()
_layout=qtwidts.QVBoxLayout(_小部件)
_layout.addWidget(self.form\u小部件)
self.setCentralWidget(\u小部件)
如果名称=“\uuuuu main\uuuuuuuu”:
app=qtwidts.QApplication.instance()或qtwidts.QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
w=主窗口()
w、 show()
sys.exit(app.exec_())

共享.ui………任何具有信号插槽定义的ui文件都不会。不工作。这完全解决了问题,非常感谢!我已经尝试在主窗口中使用相关的slot方法,但是在相应的widget类中使用它也可以让一切变得更加清晰。请您解释一下为什么使用@QtCore.pyqtSlot()decorator是有利的?“它也可以在没有读的情况下工作。”damada read说
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <widget class="QGroupBox" name="groupBox">
     <property name="title">
      <string>GroupBox</string>
     </property>
     <layout class="QGridLayout" name="gridLayout_2">
      <item row="0" column="0">
       <widget class="QPushButton" name="pushButton">
        <property name="text">
         <string>PushButton</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton</sender>
   <signal>clicked()</signal>
   <receiver>Form</receiver>
   <slot>init()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>203</x>
     <y>162</y>
    </hint>
    <hint type="destinationlabel">
     <x>396</x>
     <y>201</y>
    </hint>
   </hints>
  </connection>
 </connections>
 <slots>
  <slot>init()</slot>
 </slots>
</ui>