【问题标题】:PyQt4 slot system transition to PyQt5PyQt4 插槽系统过渡到 PyQt5
【发布时间】:2017-09-01 22:04:24
【问题描述】:

我按照一些在线教程学习了使用 PyQt 进行线程化,但该示例使用 PyQt4,而我正在使用 PyQt5。我阅读此链接以获取一些信息:http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html

但我仍然不明白我应该如何更改下面的示例以使其与 PyQt5 一起使用。

这个例子应该做的是在进度条上显示cpu百分比,我使用线程的原因是当cpu负载变化时进度条值会改变。

所以仅供参考,下面的代码是适用于 PyQt4 但不适用于版本 5 的代码,如果有人能告诉我使用 PyQt5 的正确方法会很有帮助。

我的示例代码:

import sys
import os
import sysInfo
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QWidget, QApplication

from test import Ui_Form

class MainUiClass(QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(MainUiClass, self).__init__(parent)
        self.setupUi(self)
        self.threadclass = ThreadClass()
        self.threadclass.start()
        self.connect(self.threadclass, SIGNAL('CPU_VALUE'), self.updateProgressBar)

    def updateProgressBar(self, val):
        self.progressBar.setValue(val)

class ThreadClass(QThread):
    def __init__(self, parent=None):
        super(ThreadClass, self).__init__(parent)

    def run(self):
        while 1:
            val = sysInfo.getCPU()  # get cpu load
            self.emit(SIGNAL('CPU_VALUE'), val)

if __name__ == '__main__':
    app = QApplication([])
    window = MainUiClass()
    window.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 请详细说明。您对显示的代码有任何实际问题吗?如果是这样,在问题本身中描述这些问题时要非常详细和具体。请不要将相关信息放入 cmets:请改用问题下方的编辑按钮。
  • 将编译 UI 父类的代码放入脚本中是个坏主意,但我知道这是否正在进行中。
  • 这是发出信号的旧方式。不确定它在 PyQt5 中是否有效。我发现pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html 很有用。
  • @MadPhysicist 我从代码中删除了它,但它在那里是因为这确实是一项正在进行的工作。
  • @Aidenhjj 您介意将我的示例更改为发射信号的新方式吗?这对我有很大帮助!

标签: python pyqt pyqt4 pyqt5


【解决方案1】:

声明信号的方式由pyqt4改为pyqt5:

class MainUiClass(QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(MainUiClass, self).__init__(parent)
        self.setupUi(self)
        self.threadclass = ThreadClass()
        self.threadclass.cpuValueChanged.connect(self.updateProgressBar)
        self.threadclass.start()


    def updateProgressBar(self, val):
        self.progressBar.setValue(val)

class ThreadClass(QThread):
    cpuValueChanged = pyqtSignal(int)
    def __init__(self, parent=None):
        super(ThreadClass, self).__init__(parent)

    def run(self):
        while 1:
            val = sysInfo.getCPU()  # get cpu load
            self.cpuValueChanged.emit(val)

if __name__ == '__main__':
    app = QApplication([])
    window = MainUiClass()
    window.show()
    sys.exit(app.exec_())

【讨论】:

  • 非常感谢!这是我一直在寻找的答案。我将尝试修改代码以更好地理解 Qt 中的信号和插槽。
猜你喜欢
  • 1970-01-01
  • 2013-10-08
  • 2014-08-04
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2017-11-09
相关资源
最近更新 更多