PySide \ PyQt:按钮点击后如何将值返回到UI?

时间:2016-02-11 01:26:30

标签: python button pyqt return-value pyside

我正在尝试从浏览文件夹对话框返回路径。

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

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

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

但这不起作用。它会导致浏览器对话框在加载后立即弹出,然后一旦您选择了一个错误输出的文件夹:无法连接信号clicked()。

我试图将点击的电话设置为返回,没有运气:

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

当你处理处理UI和逻辑的单独类时,有人可以引导我向正确的方向返回一个值吗?另外......像这样将它们分开是不好的做法?我知道如果我把所有内容都放到一个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

这是我的加载/测试文件(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_()

2 个答案:

答案 0 :(得分:1)

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

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

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_())

答案 1 :(得分:0)

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

<强> exporter.py

# implementation

dialog.py (主界面)

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 导入它们。

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

信号通过其形式参数将参数传递给插槽。通常,插槽具有与其信号对应物相同或更少的参数。它的插槽返回值。