我在 Qt Designer 中创建了一个小部件,但是在 Qt Designer 中实现它时QListWidget出现了问题。
理论上,当您单击列表中的一个元素时,它应该被清除listwidget并且应该在其中绘制一个新的小部件 ( Ui_Widget)。
很可能,问题出在错误的类结构中,但我不知道如何正确构建它,实际上我得到了一个错误。
AttributeError:“Ui_Widget”对象没有属性“titlelabel_2”
# -*- coding: utf-8 -*-
import sys
import httpx
from PySide6 import QtWidgets, QtGui, QtCore
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt, SIGNAL)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QLineEdit, QMainWindow, QPushButton,
QSizePolicy, QStatusBar, QVBoxLayout, QWidget, QListWidget, QMessageBox, QListView,
QHBoxLayout, QGridLayout, QFrame, QButtonGroup, QLabel)
class Ui_Widget(object):
def setupUi(self, Widget):
if not Widget.objectName():
Widget.setObjectName(u"Widget")
Widget.resize(980, 747)
Widget.setStyleSheet(u"background-color: #121212;")
self.gridLayout = QGridLayout(Widget)
self.gridLayout.setObjectName(u"gridLayout")
self.frame = QFrame(Widget)
self.frame.setObjectName(u"frame")
self.frame.setFrameShape(QFrame.StyledPanel)
self.frame.setFrameShadow(QFrame.Raised)
self.gridLayout_2 = QGridLayout(self.frame)
self.gridLayout_2.setObjectName(u"gridLayout_2")
self.iconlabel_2 = QLabel(self.frame)
self.iconlabel_2.setObjectName(u"iconlabel_2")
self.iconlabel_2.setMinimumSize(QSize(160, 210))
self.iconlabel_2.setMaximumSize(QSize(160, 210))
self.iconlabel_2.setStyleSheet(u"#iconlabel_2 {\n"
" border: 2px solid #141414;\n"
" background-color: #212121;\n"
" border-radius: 20px;\n"
"}")
self.gridLayout_2.addWidget(self.iconlabel_2, 0, 0, 2, 1)
self.descriptionlabel_2 = QLabel(self.frame)
self.descriptionlabel_2.setObjectName(u"descriptionlabel_2")
self.descriptionlabel_2.setStyleSheet(u"color: #bfbfbf;\n"
"")
self.descriptionlabel_2.setTextFormat(Qt.AutoText)
self.descriptionlabel_2.setAlignment(Qt.AlignLeading | Qt.AlignLeft | Qt.AlignTop)
self.descriptionlabel_2.setWordWrap(True)
self.gridLayout_2.addWidget(self.descriptionlabel_2, 1, 1, 1, 1)
self.titlelabel_2 = QLabel(self.frame)
self.titlelabel_2.setObjectName(u"titlelabel_2")
self.titlelabel_2.setMaximumSize(QSize(16777215, 20))
self.titlelabel_2.setStyleSheet(u"color: #bfbfbf;\n"
"")
self.gridLayout_2.addWidget(self.titlelabel_2, 0, 1, 1, 1)
self.serieslistWidget_2 = QListWidget(self.frame)
self.serieslistWidget_2.setObjectName(u"serieslistWidget_2")
self.serieslistWidget_2.setStyleSheet(u"#serieslistWidget_2 {\n"
" border: 2px solid #141414;\n"
" background-color: #212121;\n"
" border-radius: 20px;\n"
"}\n"
"#serieslistWidget_2::item {\n"
" background-color: #212121; \n"
"} \n"
"#serieslistWidget_2::item:selected { /* <---- */ \n"
" background-color: #0f0f0f; /* <---- */ \n"
"} \n"
"#serieslistWidget_2::item:hover { /* <---- */ \n"
" background-color: #0f0f0f; /* <---- */ \n"
"}")
self.serieslistWidget_2.setProperty("isWrapping", False)
self.gridLayout_2.addWidget(self.serieslistWidget_2, 2, 0, 1, 2)
self.gridLayout.addWidget(self.frame, 0, 0, 1, 1)
QMetaObject.connectSlotsByName(Widget)
# setupUi
def setTitle(self, text):
self.titlelabel_2.setText(text)
def setDescription(self, text):
self.descriptionlabel_2.setText(text)
def setIcon(self, imagePath):
self.iconlabel_2.setPixmap(QtGui.QPixmap(imagePath).scaled(
160, 210))
class CustomQWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(CustomQWidget, self).__init__(parent)
self.titleLabel = QtWidgets.QLabel()
self.titleLabel.setStyleSheet('''color: White; background-color: #212121; font-size:24px; border-radius: 15px;
min-height: 50px;
max-height: 50px;
min-width: 50px;
max-width: 500px;
''')
self.descriptionLabel = QtWidgets.QLabel()
self.descriptionLabel.setWordWrap(True)
self.descriptionLabel.setStyleSheet(
'color: White; background-color: #212121; max-height: 150px; border-radius: 15px; ')
self.vBoxLayout = QtWidgets.QVBoxLayout()
self.vBoxLayout.addWidget(self.titleLabel, 0)
self.vBoxLayout.addWidget(self.descriptionLabel, 1)
self.vBoxLayout.setSpacing(0)
self.iconQLabel = QtWidgets.QLabel()
self.iconQLabel.setMaximumSize(160, 210)
self.hBoxLayout = QtWidgets.QHBoxLayout(self)
self.hBoxLayout.addWidget(self.iconQLabel, 0)
self.hBoxLayout.addLayout(self.vBoxLayout, 1)
def setTitle(self, text):
self.titleLabel.setText(text)
def setDescription(self, text):
self.descriptionLabel.setText(text)
def setIcon(self, imagePath):
self.iconQLabel.setPixmap(QtGui.QPixmap(imagePath).scaled(
160, 210))
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(872, 567)
MainWindow.setAutoFillBackground(False)
MainWindow.setStyleSheet(u"background-color: #121212;")
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.horizontalLayout = QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.gridLayout = QGridLayout()
self.gridLayout.setObjectName(u"gridLayout")
self.lineEdit = QLineEdit(self.centralwidget)
self.lineEdit.setObjectName(u"lineEdit")
self.lineEdit.setStyleSheet(u"QLineEdit {\n"
"border: 2px solid #141414;\n"
"border-radius: 10px;\n"
"background-color: #212121;\n"
"color: White\n"
"}")
self.gridLayout.addWidget(self.lineEdit, 0, 4, 1, 1)
self.settingsbutton = QPushButton(self.centralwidget)
self.buttonGroup = QButtonGroup(MainWindow)
self.buttonGroup.setObjectName(u"buttonGroup")
self.buttonGroup.addButton(self.settingsbutton)
self.settingsbutton.setObjectName(u"settingsbutton")
self.settingsbutton.setStyleSheet(u"color: #bfbfbf;")
icon = QIcon()
icon.addFile(u"res/pictures/settings.png", QSize(), QIcon.Normal, QIcon.Off)
self.settingsbutton.setIcon(icon)
self.gridLayout.addWidget(self.settingsbutton, 0, 6, 1, 1)
self.searchbutton = QPushButton(self.centralwidget)
self.buttonGroup.addButton(self.searchbutton)
self.searchbutton.setObjectName(u"searchbutton")
self.searchbutton.setStyleSheet(u"color: #bfbfbf; ")
icon1 = QIcon()
icon1.addFile(u"res/pictures/search.png", QSize(), QIcon.Normal, QIcon.Off)
self.searchbutton.setIcon(icon1)
self.gridLayout.addWidget(self.searchbutton, 0, 5, 1, 1)
self.horizontalLayout_3 = QHBoxLayout()
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.gridLayout.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
self.achievementbutton_2 = QPushButton(self.centralwidget)
self.buttonGroup.addButton(self.achievementbutton_2)
self.achievementbutton_2.setObjectName(u"achievementbutton_2")
self.achievementbutton_2.setStyleSheet(u"color: #bfbfbf;\n"
"border: 2px solid #141414;\n"
"border-radius: 2px;")
icon2 = QIcon()
icon2.addFile(u"res/pictures/favorite.png", QSize(), QIcon.Normal, QIcon.Off)
self.achievementbutton_2.setIcon(icon2)
self.gridLayout.addWidget(self.achievementbutton_2, 0, 1, 1, 1)
self.folderbutton = QPushButton(self.centralwidget)
self.buttonGroup.addButton(self.folderbutton)
self.folderbutton.setObjectName(u"folderbutton")
self.folderbutton.setStyleSheet(u"color: #bfbfbf; ")
icon3 = QIcon()
icon3.addFile(u"res/pictures/folder.png", QSize(), QIcon.Normal, QIcon.Off)
self.folderbutton.setIcon(icon3)
self.gridLayout.addWidget(self.folderbutton, 0, 3, 1, 1)
self.achievementbutton = QPushButton(self.centralwidget)
self.buttonGroup.addButton(self.achievementbutton)
self.achievementbutton.setObjectName(u"achievementbutton")
self.achievementbutton.setStyleSheet(u"color: #bfbfbf; ")
icon4 = QIcon()
icon4.addFile(u"res/pictures/achievement.png", QSize(), QIcon.Normal, QIcon.Off)
self.achievementbutton.setIcon(icon4)
self.gridLayout.addWidget(self.achievementbutton, 0, 2, 1, 1)
self.listWidget = QListWidget(self.centralwidget)
self.listWidget.setObjectName(u"listWidget")
self.listWidget.viewport().setProperty("cursor", QCursor(Qt.ArrowCursor))
self.listWidget.setToolTipDuration(-5)
self.listWidget.setAutoFillBackground(False)
self.listWidget.setStyleSheet(u"#listWidget {\n"
" border: 2px solid #141414;\n"
" background-color: #212121;\n"
" border-radius: 20px;\n"
"}\n"
"#listWidget::item {\n"
" background-color: #212121; \n"
"} \n"
"#listWidget::item:selected { /* <---- */ \n"
" background-color: #0f0f0f; /* <---- */ \n"
"} \n"
"#listWidget::item:hover { /* <---- */ \n"
" background-color: #0f0f0f; /* <---- */ \n"
"}")
self.listWidget.setFrameShape(QFrame.NoFrame)
self.listWidget.setFrameShadow(QFrame.Plain)
self.listWidget.setLineWidth(0)
self.listWidget.setMovement(QListView.Static)
self.listWidget.setResizeMode(QListView.Fixed)
self.listWidget.setSortingEnabled(False)
self.gridLayout.addWidget(self.listWidget, 1, 0, 1, 7)
self.horizontalLayout.addLayout(self.gridLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.pixmap = QPixmap()
i = 0
listdata = [
{
"title": "Название",
"description": "Описание",
"icon": "Ok.png",
},
]
for list in listdata:
customQWidget = CustomQWidget()
customQWidget.setTitle(list["title"])
customQWidget.setDescription(list["description"])
customQWidget.setIcon(list["icon"])
item = QtWidgets.QListWidgetItem(self.listWidget)
item.setSizeHint(customQWidget.sizeHint())
self.listWidget.addItem(item)
item.setData(1, i)
self.listWidget.setItemWidget(item, customQWidget)
i += 1
self.listWidget.itemClicked.connect(self.Clicked)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.settingsbutton.setText("")
self.searchbutton.setText("")
self.achievementbutton_2.setText(
QCoreApplication.translate("MainWindow", u"\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", None))
self.folderbutton.setText(
QCoreApplication.translate("MainWindow", u"\u041a\u0430\u0442\u0430\u043b\u043e\u0433", None))
self.achievementbutton.setText(
QCoreApplication.translate("MainWindow", u"\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f", ))
def Clicked(self):
self.listWidget.clear()
customqwidget2 = Ui_Widget()
customqwidget2.setTitle("Тут название")
customqwidget2.setDescription("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum")
customqwidget2.setIcon("ok.png")
item = QtWidgets.QListWidgetItem(self.listWidget)
item.setSizeHint(customqwidget2.sizeHint())
self.listWidget.addItem(item)
self.listWidget.setItemWidget(item, customqwidget2)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
永远不要更改 Qt Designer 生成的代码。
创建另一个从相应小部件继承的类,并使用生成的类来填充它。