PySide \ PyQt:单击按钮后如何将 return 值更改为 UI?

PySide \ PyQt: How to return value to UI after button click?

我正在尝试 return 来自浏览文件夹对话框的路径。

我试过将实例对象甚至属性传递给调用并将其设置在那里:

self.browseBtn.clicked.connect(myExporter.browseFolder(self))

self.browseBtn.clicked.connect(myExporter.browseFolder(self.path))

但这行不通。它会导致浏览器对话框在加载后立即弹出,然后一旦您选择了一个文件夹,它就会出错:Failed to connect signal clicked().

我尝试将点击调用设置为 return,但没有成功:

result = self.browseBtn.clicked.connect(myExporter.browseFolder)

当您处理单独的 类 处理 UI 和逻辑时,有人可以指导我如何 return 一个值吗?另外...像这样将它们分开是不好的做法吗?我知道如果我将所有内容都放入一个 python 文件中,我可能会很容易地解决这个问题,但我认为那是不合适的。

这是我的 ui 文件 (ui.py):

from PySide import QtCore, QtGui

class Ui_Dialog(object):
    def __init__(self):
        self.path =""

    def setupUi(self, Dialog, myExporter):
        Dialog.setObjectName("Dialog")
        Dialog.resize(382, 589)
        ...
        .......
        ............. 
        .................
        self.retranslateUi(Dialog)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

        self.browseBtn.clicked.connect(myExporter.browseFolder)

这是我的导出文件 (exporter.py):

class Exporter(object):
    def __init__(self):
        ...
        ......

    def browseFolder(self):
        ...
        .......
        do something
        ...........    
        return path

这是我的 load/test 文件 (loadExporter.py):

import ui as interface
import exporter as exporter
from PySide import QtCore, QtGui

app = QtGui.QApplication.instance()
if app is None:
    app = QtGui.QApplication(sys.argv)       
Dialog = QtGui.QDialog()
myExporter = exporter.Exporter()
myUI = interface.Ui_Dialog()
myUI.setupUi(Dialog, myExporter)
Dialog.show()
app.exec_()

将它们放在单独的文件中并不一定不好。为某些小部件创建一个单独的文件是一件好事,特别是如果这些小部件可以重复使用的话。

我希望我的主文件有一个 QMainWindow class。

class MyWindow(QtGui.QMainWindow):
    pass

if __name__ == "__main__":
    QtGui.QApplication([])

    mywindow = MyWindow()
    mywindow.show()

    sys.exit(QtGui.qApp.exec_())

if __name__ == "__main__" 中包装应用程序功能可防止此代码在另一个文件尝试导入此文件时 运行。

信号 (self.browserBtn.clicked) 调用回调方法。在 python.

中一切都是对象
def my_func():
    pass

new_func_name = my_func # my_func can be reassigned like any variable

my_func 是一个对象。 self.browseBtn.clicked.connect(my_func) 将 my_func 作为变量传递给以后调用。

当发生 self.browserBtn.clicked.emit() 时(在用户单击时),它与调用连接的函数相同 my_func()。其他信号可能会将值传递给回调函数 self.lineEdit.textChanged.connect(my_func) 调用 'my_func(new_text)'

您希望您的函数为您调用所有内容。

def open_file(filename=None):
    """Open a file."""
    # If a filename isn't given ask the user for a file
    if filename is None:
        filename, ext = QtGUi.QFileDialog.getOpenFileName(None, "Open File", ".../My Documents/")
        # You may have to use the ext to make a proper filename

    # Open the file
    with open(filename, "r") as file:
        file.read()

self.browserBtn.clicked.connect(open_file)

结构

...
import mywidget

class MyWindow(QtGui.QMainWindow):
    def __init__(self):
        super().__init__()
        ...
        self.show_file = QtGui.QLineEdit()
        self.setCentralWidget(self.show_file)

        self.exporter = mywidget.Exporter()
        self.browserBtn.clicked.connect(self.open_file)

    def open_file(self, filename=None):
        """Open a file."""
        path = self.exporter.browseFolder()
        # Do something with the path
        self.show_file.setText(path)

if __name__ == "__main__":
    QtGui.QApplication([])

    mywindow = MyWindow()
    mywindow.show()

    sys.exit(QtGui.qApp.exec_())

我不认为我完全理解你想要实现的目标,但我可以建议以下解决方案。

exporter.py

# implementation

dialog.py(主要UI)

import PyQt4.QtGui as qg
from exporter import Exporter

class Dialog(qg.QDialog):

    def __init__(self):
        super().__init__()
        self.path = None
        self.setup_widgets()

    def setup_widgets(self):
        self.browse.clicked.connect(self.on_browse_clicked)

    def on_browse_clicked(self):
        self.path = Exporter().browse_folder()

main.py

import sys
import PyQt4.QtGui as qg
from dialog import Dialog

if __name__ == '__main__':
    app = qg.QApplication(sys.argv)
    dialog = Dialog()
    dialog.show()
    sys.exit(app.exec_())

这样你仍然有三个文件,但是 dialog.py 导入 exporter.py 而不是 main.py 导入它们。

至于 returning 信号值,我不知道;我认为信号是空的(不要 return 值)。

信号通过形式参数将参数传递给槽。通常插槽的参数与其对应的信号相同或更少。 return 看重的是插槽。