【问题标题】:Trying to use qtdesigner instead of manually creating gui all the time. having trouble getting started with a listview尝试使用 qtdesigner 而不是一直手动创建 gui。无法开始使用列表视图
【发布时间】:2022-01-12 00:12:14
【问题描述】:

我正在为一些我认为很简单但看不到的事情而苦苦挣扎。

我正在尝试开始使用 qtdesigner 进行我的 gui 设计和维护,但我在解决如何从 qtdesigner 的输出中访问它们时遇到问题。我已经通过 pyuic5.exe 运行它们并从设计器的 xml 生成 Python 代码并设置一个 app.py 以将其导入以运行我的代码。

这里是 app.py:

import sys
from PyQt5 import QtGui
from PyQt5.QtGui import QStandardItem, QStandardItemModel

from PyQt5.QtWidgets import (
    QApplication, QDialog, QMainWindow, QMessageBox, QListView
)

from PyQt5.QtSql import (
    QSqlDatabase, QSqlDriver, QSqlQuery
)

import PyQt5.QtCore

from PyQt5.uic import loadUi

from main_window_ui import Ui_MainWindow

class Window(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.connectSignalsSlots()
        updateTemplateList()
    def connectSignalsSlots(self):
        self.action_Exit.triggered.connect(self.close)
        #self.action_About.triggered.connect(self.about)

def updateTemplateList():
    model = QStandardItemModel()
    listView.setModel(model)

    entries = ['one','two', 'three']

    for i in entries:
        item = QStandardItem(i)
        model.appendRow(item)

    model.layoutChanged.emit()

def checkDB():
    # Try to open the connection and handle possible errors
    if not con.open():
        QMessageBox.critical(
            None,
            "App Name - Error!",
            "Database Error: %s" % con.lastError().databaseText(),
        )
        sys.exit(1)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    checkDB()
    win = Window()
    win.show()
    sys.exit(app.exec())

运行pyui5.exe后的设计器输出为:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '.\ui\main_window_ui.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(309, 652)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listView = QtWidgets.QListView(self.centralwidget)
        self.listView.setGeometry(QtCore.QRect(10, 40, 291, 521))
        self.listView.setObjectName("listView")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 570, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(210, 570, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(110, 570, 93, 28))
        self.pushButton_3.setObjectName("pushButton_3")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(60, 10, 211, 16))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label.setFont(font)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 309, 26))
        self.menubar.setObjectName("menubar")
        self.menu_file = QtWidgets.QMenu(self.menubar)
        self.menu_file.setObjectName("menu_file")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action_Exit = QtWidgets.QAction(MainWindow)
        self.action_Exit.setObjectName("action_Exit")
        self.actionAbout = QtWidgets.QAction(MainWindow)
        self.actionAbout.setObjectName("actionAbout")
        self.menu_file.addAction(self.action_Exit)
        self.menu_file.addAction(self.actionAbout)
        self.menubar.addAction(self.menu_file.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Edit"))
        self.pushButton_2.setText(_translate("MainWindow", "Delete"))
        self.pushButton_3.setText(_translate("MainWindow", "Add"))
        self.label.setText(_translate("MainWindow", "Job Data for instructions"))
        self.menu_file.setTitle(_translate("MainWindow", "&File"))
        self.action_Exit.setText(_translate("MainWindow", "&Exit"))
        self.actionAbout.setText(_translate("MainWindow", "About"))

我正在尝试使用 updateTemplateList() 更新此处的列表视图,但似乎无法到达那里。

提前感谢您的帮助:-)

【问题讨论】:

    标签: python pyqt qt-designer


    【解决方案1】:

    主要的错误是你引用了不存在的对象,例如 listView 没有被创建并且和Ui_MainWindow 的 listView 属性不同,必须通过实例引用。

    import sys
    
    from PyQt5.QtGui import QStandardItem, QStandardItemModel
    from PyQt5.QtWidgets import QApplication, QMainWindow, QListView
    
    from main_window_ui import Ui_MainWindow
    
    
    class Window(QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setupUi(self)
            self.model = QStandardItemModel()
            self.listView.setModel(self.model)
            self.connectSignalsSlots()
            self.updateTemplateList()
    
        def connectSignalsSlots(self):
            self.action_Exit.triggered.connect(self.close)
            # self.action_About.triggered.connect(self.about)
    
        def updateTemplateList(self):
            entries = ["one", "two", "three"]
            for i in entries:
                item = QStandardItem(i)
                self.model.appendRow(item)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = Window()
        win.show()
        sys.exit(app.exec())
    

    建议:复习你的OOP笔记,尤其是继承、实例等概念。

    【讨论】:

    • 您好,感谢您的关注。是的,我已经尝试了所有我能想到的组合来访问在导入从 qtdesigner 应用程序生成的 main_window_ui.py 时创建的实例,并且我确信我做对了但没有......我要去看看别的东西,稍后再回来,只是想知道它认为正确的实例是什么,我应该使用它来访问它......
    • @JustinCarlson 您的代码问题与您尝试访问 UI 的方式无关(除了没有 listView 的事实),除非您尝试访问 UI 元素使用 class(而不是 instance)或者每次尝试访问它们时都在创建一个 new 实例。正如 eyllanesc 已经指出的那样,对 OOP 的非常重要的方面进行一些研究,例如类、实例、继承和方法。将您的代码与他的代码进行比较,并尝试了解其中的差异,这些差异非常很重要。
    • 哇,我不知道我前几天在做什么,但是今天更有意义 :-) 谢谢你的帮助!
    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多