Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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 在PyQt中使用自定义小部件?_Python_Multithreading_Qt_Python 3.x_Pyqt - Fatal编程技术网

Python 在PyQt中使用自定义小部件?

Python 在PyQt中使用自定义小部件?,python,multithreading,qt,python-3.x,pyqt,Python,Multithreading,Qt,Python 3.x,Pyqt,我按照(PyQT4)在PyQT5中创建了一个“自定义小部件”,最后得到了以下代码: progress.py from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import (QApplication,QMainWindow) class Ui_Form(QMainWindow): def __init__(self, name, parent=None): super(Ui_Form,self

我按照(PyQT4)在PyQT5中创建了一个“自定义小部件”,最后得到了以下代码:

progress.py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication,QMainWindow)

class Ui_Form(QMainWindow):
    def __init__(self, name, parent=None):
        super(Ui_Form,self).__init__(parent)
        #Form.setObjectName("Form")
        self.resize(619, 202)
        self.formLayoutWidget = QtWidgets.QWidget()
        self.formLayoutWidget.setGeometry(QtCore.QRect(0, 0, 621, 201))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.progressBar = QtWidgets.QProgressBar(self.formLayoutWidget)
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.progressBar)
        self.graphicsView = QtWidgets.QGraphicsView(self.formLayoutWidget)
        self.graphicsView.setObjectName("graphicsView")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.graphicsView)
        self.label_Title = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setFamily("Verdana")
        font.setPointSize(22)
        font.setBold(True)
        font.setWeight(75)
        self.label_Title.setFont(font)
        self.label_Title.setObjectName("label_Title")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.label_Title)
        self.timer = QtCore.QBasicTimer()
        self.step = 0
        self.timer.start(100,self)

        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self)


        def timerEvent(self, e):
            if self.step>= 100:
                self.timer.stop()
                return
            self.step = self.step + 1
            self.progressBar.setValue(self.step)   

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("Form", "Form"))
        self.label_Title.setText(_translate("Form", "TextLabel"))
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(742, 538)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_Start = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_Start.setGeometry(QtCore.QRect(630, 20, 91, 31))
        self.pushButton_Start.setObjectName("pushButton_Start")
        self.lineEdit_URL = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_URL.setGeometry(QtCore.QRect(20, 20, 601, 31))
        self.lineEdit_URL.setObjectName("lineEdit_URL")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 460, 46, 13))
        self.label.setObjectName("label")
        self.label_status = QtWidgets.QLabel(self.centralwidget)
        self.label_status.setGeometry(QtCore.QRect(73, 460, 651, 16))
        self.label_status.setObjectName("label_status")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(20, 60, 701, 391))
        self.listWidget.setObjectName("listWidget")
        #MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 742, 21))
        self.menubar.setObjectName("menubar")
        #MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        #MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "My Downloader"))
        self.pushButton_Start.setText(_translate("MainWindow", "Start"))
        self.label.setText(_translate("MainWindow", "Status :"))
        self.label_status.setText(_translate("MainWindow", "Ideal..."))




if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
import sys
import threading
import logging
from PyQt5 import QtCore, QtGui, QtWidgets
import json
import urllib.request
from new_ui import Ui_MainWindow
import progress
import random

class MyForm(QtWidgets.QDialog):
  def __init__(self, parent=None):
    super(MyForm, self).__init__(parent)
    self.ui = Ui_MainWindow()
    self.ui.setupUi(self)
    self.ui.pushButton_Start.clicked.connect(self.thread_start)

  def thread_start(self):
    p = threading.Thread(name='worker', target=self.start_download)
    #Do UI updates
    self.ui.label_status.setText('Fetching information...')
    #self.listWidget.addItem(prgstr)
    p.start()

  def start_download(self):

        ............
        code to fetch information from web
        ............

        #itm = self.ui.listWidget.addItem(json_data['entries'][0]['title'])
        self.ui.label_status.setText(json_data['entries'][0]['title'])
        item = QtWidgets.QListWidgetItem(self.ui.listWidget)
        item_widget = progress.Ui_Form("It works")
        item.setSizeHint(item_widget.sizeHint())
        self.ui.listWidget.addItem(item)
        self.ui.listWidget.setItemWidget(item,item_widget)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())
新用户界面py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication,QMainWindow)

class Ui_Form(QMainWindow):
    def __init__(self, name, parent=None):
        super(Ui_Form,self).__init__(parent)
        #Form.setObjectName("Form")
        self.resize(619, 202)
        self.formLayoutWidget = QtWidgets.QWidget()
        self.formLayoutWidget.setGeometry(QtCore.QRect(0, 0, 621, 201))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.progressBar = QtWidgets.QProgressBar(self.formLayoutWidget)
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.progressBar)
        self.graphicsView = QtWidgets.QGraphicsView(self.formLayoutWidget)
        self.graphicsView.setObjectName("graphicsView")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.graphicsView)
        self.label_Title = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setFamily("Verdana")
        font.setPointSize(22)
        font.setBold(True)
        font.setWeight(75)
        self.label_Title.setFont(font)
        self.label_Title.setObjectName("label_Title")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.label_Title)
        self.timer = QtCore.QBasicTimer()
        self.step = 0
        self.timer.start(100,self)

        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self)


        def timerEvent(self, e):
            if self.step>= 100:
                self.timer.stop()
                return
            self.step = self.step + 1
            self.progressBar.setValue(self.step)   

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("Form", "Form"))
        self.label_Title.setText(_translate("Form", "TextLabel"))
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(742, 538)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_Start = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_Start.setGeometry(QtCore.QRect(630, 20, 91, 31))
        self.pushButton_Start.setObjectName("pushButton_Start")
        self.lineEdit_URL = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_URL.setGeometry(QtCore.QRect(20, 20, 601, 31))
        self.lineEdit_URL.setObjectName("lineEdit_URL")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 460, 46, 13))
        self.label.setObjectName("label")
        self.label_status = QtWidgets.QLabel(self.centralwidget)
        self.label_status.setGeometry(QtCore.QRect(73, 460, 651, 16))
        self.label_status.setObjectName("label_status")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(20, 60, 701, 391))
        self.listWidget.setObjectName("listWidget")
        #MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 742, 21))
        self.menubar.setObjectName("menubar")
        #MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        #MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "My Downloader"))
        self.pushButton_Start.setText(_translate("MainWindow", "Start"))
        self.label.setText(_translate("MainWindow", "Status :"))
        self.label_status.setText(_translate("MainWindow", "Ideal..."))




if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
import sys
import threading
import logging
from PyQt5 import QtCore, QtGui, QtWidgets
import json
import urllib.request
from new_ui import Ui_MainWindow
import progress
import random

class MyForm(QtWidgets.QDialog):
  def __init__(self, parent=None):
    super(MyForm, self).__init__(parent)
    self.ui = Ui_MainWindow()
    self.ui.setupUi(self)
    self.ui.pushButton_Start.clicked.connect(self.thread_start)

  def thread_start(self):
    p = threading.Thread(name='worker', target=self.start_download)
    #Do UI updates
    self.ui.label_status.setText('Fetching information...')
    #self.listWidget.addItem(prgstr)
    p.start()

  def start_download(self):

        ............
        code to fetch information from web
        ............

        #itm = self.ui.listWidget.addItem(json_data['entries'][0]['title'])
        self.ui.label_status.setText(json_data['entries'][0]['title'])
        item = QtWidgets.QListWidgetItem(self.ui.listWidget)
        item_widget = progress.Ui_Form("It works")
        item.setSizeHint(item_widget.sizeHint())
        self.ui.listWidget.addItem(item)
        self.ui.listWidget.setItemWidget(item,item_widget)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())
main.py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication,QMainWindow)

class Ui_Form(QMainWindow):
    def __init__(self, name, parent=None):
        super(Ui_Form,self).__init__(parent)
        #Form.setObjectName("Form")
        self.resize(619, 202)
        self.formLayoutWidget = QtWidgets.QWidget()
        self.formLayoutWidget.setGeometry(QtCore.QRect(0, 0, 621, 201))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.progressBar = QtWidgets.QProgressBar(self.formLayoutWidget)
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.progressBar)
        self.graphicsView = QtWidgets.QGraphicsView(self.formLayoutWidget)
        self.graphicsView.setObjectName("graphicsView")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.graphicsView)
        self.label_Title = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setFamily("Verdana")
        font.setPointSize(22)
        font.setBold(True)
        font.setWeight(75)
        self.label_Title.setFont(font)
        self.label_Title.setObjectName("label_Title")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.label_Title)
        self.timer = QtCore.QBasicTimer()
        self.step = 0
        self.timer.start(100,self)

        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self)


        def timerEvent(self, e):
            if self.step>= 100:
                self.timer.stop()
                return
            self.step = self.step + 1
            self.progressBar.setValue(self.step)   

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("Form", "Form"))
        self.label_Title.setText(_translate("Form", "TextLabel"))
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(742, 538)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_Start = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_Start.setGeometry(QtCore.QRect(630, 20, 91, 31))
        self.pushButton_Start.setObjectName("pushButton_Start")
        self.lineEdit_URL = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_URL.setGeometry(QtCore.QRect(20, 20, 601, 31))
        self.lineEdit_URL.setObjectName("lineEdit_URL")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 460, 46, 13))
        self.label.setObjectName("label")
        self.label_status = QtWidgets.QLabel(self.centralwidget)
        self.label_status.setGeometry(QtCore.QRect(73, 460, 651, 16))
        self.label_status.setObjectName("label_status")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(20, 60, 701, 391))
        self.listWidget.setObjectName("listWidget")
        #MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 742, 21))
        self.menubar.setObjectName("menubar")
        #MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        #MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "My Downloader"))
        self.pushButton_Start.setText(_translate("MainWindow", "Start"))
        self.label.setText(_translate("MainWindow", "Status :"))
        self.label_status.setText(_translate("MainWindow", "Ideal..."))




if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
import sys
import threading
import logging
from PyQt5 import QtCore, QtGui, QtWidgets
import json
import urllib.request
from new_ui import Ui_MainWindow
import progress
import random

class MyForm(QtWidgets.QDialog):
  def __init__(self, parent=None):
    super(MyForm, self).__init__(parent)
    self.ui = Ui_MainWindow()
    self.ui.setupUi(self)
    self.ui.pushButton_Start.clicked.connect(self.thread_start)

  def thread_start(self):
    p = threading.Thread(name='worker', target=self.start_download)
    #Do UI updates
    self.ui.label_status.setText('Fetching information...')
    #self.listWidget.addItem(prgstr)
    p.start()

  def start_download(self):

        ............
        code to fetch information from web
        ............

        #itm = self.ui.listWidget.addItem(json_data['entries'][0]['title'])
        self.ui.label_status.setText(json_data['entries'][0]['title'])
        item = QtWidgets.QListWidgetItem(self.ui.listWidget)
        item_widget = progress.Ui_Form("It works")
        item.setSizeHint(item_widget.sizeHint())
        self.ui.listWidget.addItem(item)
        self.ui.listWidget.setItemWidget(item,item_widget)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())
上面的代码运行时没有任何错误,但是下面的代码无法添加任何列表项(自定义小部件),
label\u status
正确填充检索到的数据-我在这里缺少什么

    self.ui.label_status.setText(json_data['entries'][0]['title'])
    item = QtWidgets.QListWidgetItem(self.ui.listWidget)
    item_widget = progress.Ui_Form("It works")
    item.setSizeHint(item_widget.sizeHint())
    self.ui.listWidget.addItem(item)
    self.ui.listWidget.setItemWidget(item,item_widget)

您应该只从主GUI线程中更新GUI元素

工作线程应该在完成时发出一个信号,或者周期性地发出信号,以便处理挂起的GUI事件(即,通过调用
qApp.processEvents()

如果工作线程生成数据,请使用,以便可以从主线程安全地访问数据

更新

下面是一个如何使用worker对象的基本示例(仅限python3)。GUI线程和工作线程之间的所有通信都是使用信号和插槽完成的(有关更多信息,请参阅Qt文档中的“”


因此,您的意思是,这里没有填充
item\u widget
,是因为使用了这种方法。我仍然在这里学习python和qt,你能告诉我吗。提供一个例子?@Stacked。我在回答中增加了一个例子。这是非常不言自明的,你应该能够适应你的需要很容易。谢谢,会检查和张贴回来。请。说明如何使用上述方法检索下载进度更新?@Stacked。这是多线程的一个独立问题,因此请提出一个新问题。问题是“如何在多线程中跟踪下载程序类的钩子更新进度”,请回答。如果无法更新示例,请提供想法和指针。