我正在尝试从浏览文件夹对话框返回路径。
我尝试将实例对象甚至属性传递给调用并将其设置在那里:
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_()
答案 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 导入它们。
至于信号的返回值,我不知道;我认为信号是空洞的(不要返回值)。
信号通过其形式参数将参数传递给插槽。通常,插槽具有与其信号对应物相同或更少的参数。它的插槽返回值。