首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从QWidget向QStatusBar发送消息?

如何从QWidget向QStatusBar发送消息?
EN

Stack Overflow用户
提问于 2019-10-13 06:28:28
回答 1查看 86关注 0票数 0

有没有一种方法可以在PySide2中从QWidget向QStatusBar发送进度消息?一种在发生事件时发出消息的方法,另一个对象接收该消息并相应地更改消息。

我一直在尝试使用QObject.emit()和QObject.connect()来传递字符串并在QStatusBar上显示,但没有结果,因为它们都在不同的类中。

我只对简单的操作使用了emit和connect,比如关闭父窗口和子窗口,所以如果emit和connect不是处理这个问题的正确方法,请建议其他传递消息的方法。

代码语言:javascript
复制
import os
import shutil

from PySide2 import QtWidgets
from PySide2.QtCore import SIGNAL, SLOT

class ChildWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ChildWidget, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setLayout(QtWidgets.QGridLayout())
        label_A = QtWidgets.QLabel("Path A: ", self)
        self.text_A = QtWidgets.QLineEdit(self)
        label_B = QtWidgets.QLabel("Path B: ", self)
        self.text_B = QtWidgets.QLineEdit(self)
        button_A = QtWidgets.QPushButton("Copy", self)

        button_A.clicked.connect(self.copy_function)

        self.layout().addWidget(label_A, 0, 0)
        self.layout().addWidget(self.text_A, 0, 1)
        self.layout().addWidget(label_B, 1, 0)
        self.layout().addWidget(self.text_B, 1, 1)
        self.layout().addWidget(button_A, 1, 2)

        self.layout().setColumnStretch(1, 1)
        self.layout().setColumnMinimumWidth(2, 72)

    def copy_function(self):
        source = self.text_A.text()
        destination = self.text_B.text()
        self.message = ''; count = 0

        file_list = os.listdir(source)
        for item in file_list:
            count = count + 1
            source_path = source +'/'+ item
            destination_path = destination +'/'+ item
            if os.path.isfile(source_path):
                shutil.copyfile(source_path, destination_path)
            # message
            self.message = 'Transferred {0} out of {1} files...'.format(
                count, len(file_list)
            )

class ParentWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ParentWidget, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.child = ChildWidget()
        self.setLayout(QtWidgets.QGridLayout())
        self.status_bar = QtWidgets.QStatusBar(self)
        self.status_bar.setSizeGripEnabled(False)
        self.h_line = QtWidgets.QFrame(self)
        self.h_line.setFrameShape(self.h_line.HLine)
        self.h_line.setFrameShadow(self.h_line.Sunken)

        # self.status_bar.showMessage(message)

        self.layout().addWidget(self.child, 0, 0)
        self.layout().addWidget(self.h_line, 1, 0)
        self.layout().addWidget(self.status_bar, 2, 0)
        self.layout().setContentsMargins(0, 0, 0, 0)

        self.setWindowTitle("Copy Window")
        self.resize(600, 60)
        self.show()

widget_window = ParentWidget()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-20 17:05:28

我在一个PyQt文档中找到了它。这是可行的。

代码语言:javascript
复制
import os
import shutil

from PySide2 import QtWidgets
from PySide2.QtCore import Signal, Slot

class ChildWidget(QtWidgets.QWidget):
    status_update = Signal(str)
    def __init__(self, parent=None):
        super(ChildWidget, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setLayout(QtWidgets.QGridLayout())
        label_A = QtWidgets.QLabel("Path A: ", self)
        self.text_A = QtWidgets.QLineEdit(self)
        label_B = QtWidgets.QLabel("Path B: ", self)
        self.text_B = QtWidgets.QLineEdit(self)
        button_A = QtWidgets.QPushButton("Copy", self)

        button_A.clicked.connect(self.copy_function)

        self.layout().addWidget(label_A, 0, 0)
        self.layout().addWidget(self.text_A, 0, 1)
        self.layout().addWidget(label_B, 1, 0)
        self.layout().addWidget(self.text_B, 1, 1)
        self.layout().addWidget(button_A, 1, 2)

        self.layout().setColumnStretch(1, 1)
        self.layout().setColumnMinimumWidth(2, 72)

    def copy_function(self):
        source = self.text_A.text()
        destination = self.text_B.text()
        count = 0

        file_list = os.listdir(source)
        for item in file_list:
            count = count + 1
            source_path = source +'/'+ item
            destination_path = destination +'/'+ item
            if os.path.isfile(source_path):
                shutil.copyfile(source_path, destination_path)
            message = 'Transferred {0} out of {1} files...'.format(
                count, len(file_list)
            )
            self.status_update.emit(message)

class ParentWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ParentWidget, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.child = ChildWidget()
        self.setLayout(QtWidgets.QGridLayout())
        self.status_bar = QtWidgets.QStatusBar(self)
        self.status_bar.setSizeGripEnabled(False)
        self.h_line = QtWidgets.QFrame(self)
        self.h_line.setFrameShape(self.h_line.HLine)
        self.h_line.setFrameShadow(self.h_line.Sunken)

        self.child.status_update.connect(self.status_message)

        self.layout().addWidget(self.child, 0, 0)
        self.layout().addWidget(self.h_line, 1, 0)
        self.layout().addWidget(self.status_bar, 2, 0)
        self.layout().setContentsMargins(0, 0, 0, 0)

        self.setWindowTitle("Copy Window")
        self.resize(600, 60)
        self.show()

    @Slot()
    def status_message(self, message):
        self.status_bar.showMessage(message)

widget_window = ParentWidget()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58359093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档