我喜欢在PyQt中使用loadUi()方法加载QtDesigner接口文件的想法,因为我经常更改ui文件,而不想不断地将其转换为py文件。
但是,我很难理解如何在ui文件中访问不同的小部件和视图。下面显示了如何在ui中加载:
class MyClass(QtGui.QMainWindow):
def __init__(self, parent = None):
super().__init__(parent)
ui = uic.loadUi('MyUserInterface.ui',self)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
mainapplication = MyClass()
mainapplication.show()
app.exec_()它显示得很好,但是我希望我能够访问GUI的元素,如下所示:
ui.sampleButton.makeDraggable()我的问题是,如何访问GUI中的各种元素?
编辑1:我也尝试过不将uic.load调用分配给ui。如下所示,访问时,我可以通过使用Ui_MainWindow访问一些属性。但是,它会抛出一个错误
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
mainapplication = MyClass()
mainapplication.Ui_MainWindow.graphicsView.acceptDrops(True)
mainapplication.show()
app.exec_()我得到的错误是...
Traceback (most recent call last): File "C:\Users\Me\workspaces\com.samplesoftware.software\src\SoftwareView\MyClass.py", line 17, in <module>
mainapplication.Ui_MainWindow.graphicsView.acceptDrops(True)
AttributeError: 'MyClass' object has no attribute 'Ui_MainWindow'有什么想法吗?
发布于 2012-12-05 19:10:01
您不需要将其转换为.py文件,但您必须为它们命名才能访问它们,否则您需要知道sampleButton在ui文件中被调用了什么。
您可以简单地将sampleButton重命名为my_btn并访问它。
发布于 2012-12-06 03:46:49
loadUi函数将ui文件路径作为第一个参数,将base-instance作为第二个参数。
基本实例应该是与UI中的顶级小部件相同的Qt类。这是因为loadUi会将所有UI插入到基础实例中,并且可能需要调用它的一些方法。UI中定义的所有子小部件都将作为base-instance的属性结束。
因此,您应该在__init__中像这样调用loadUi
class MyClass(QtGui.QMainWindow):
def __init__(self, parent = None):
super(MyClass, self).__init__(parent)
uic.loadUi('MyUserInterface.ui', self)然后,您应该能够像这样访问graphicsView:
self.graphicsView.setAcceptDrops(True)发布于 2012-12-06 13:18:45
我发现原因是因为我试图在运行app.exec_()之前调用Ui_MainWindow。在将Ui_MainWindow调用移动到末尾之后,它确实可以工作。我猜,事后看来确实有道理,MainWindow需要存在才能改变它的属性。
https://stackoverflow.com/questions/13717556
复制相似问题