PySide\PyQt:如何在单击按钮后将值返回给UI?

2024-05-14 00:35:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从“浏览文件夹”对话框返回路径。在

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

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

或者

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

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

我尝试将点击的呼叫设置为返回,但没有成功:

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

在处理处理UI和逻辑的独立类时,有人能告诉我如何返回值吗?也。。。像这样把他们分开是不是不好?我知道如果我把所有的东西都放在一个python文件中,我可能很容易解决这个问题,但我认为这是不合适的。在

这是我的ui文件(用户界面)公司名称:

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)

这是我的出口商档案(出口商.py)公司名称:

^{pr2}$

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

Tags: 文件importself名称appconnect公司exporter
2条回答

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

我希望我的主文件有一个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)调用回调方法。在python中,一切都是一个对象。在

^{pr2}$

我的函数是一个对象。self.browseBtn.clicked.connect(my_func)将myfunc作为变量传递给稍后调用。在

self.browserBtn.clicked.emit()发生时(在用户单击时),这与调用连接的函数my_func()相同。其他信号可能会将值传递给回调函数self.lineEdit.textChanged.connect(my_func)calls“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_())

我想我不完全理解你想达到什么目的,但我可以提出以下解决办法。在

出口商.py

# implementation

对话框.py(主界面)

^{pr2}$

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

这样你仍然有三个文件,但是py对话框进口出口商.py而不是主.py同时导入它们。在

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

信号通过其形式参数将参数传递给插槽。通常时隙的参数与信号对应的插槽相同或更少。是插槽返回值。在

相关问题 更多 >