【问题标题】:PyQt5 QListWidget custom items [duplicate]PyQt5 QListWidget自定义项目[重复]
【发布时间】:2020-02-05 10:48:09
【问题描述】:

我对 PyQt5 非常陌生,我正在尝试为 python3+ 中的 qlistwidget 制作自定义 qlistwidgetitem,但到目前为止没有成功。

我喜欢并尝试移植的原始代码来自此链接。不幸的是,它在 PyQt4 中:

PyQt QListWidget custom items

import sys
from PyQt4 import QtGui

class QCustomQWidget (QtGui.QWidget):
    def __init__ (self, parent = None):
        super(QCustomQWidget, self).__init__(parent)
        self.textQVBoxLayout = QtGui.QVBoxLayout()
        self.textUpQLabel    = QtGui.QLabel()
        self.textDownQLabel  = QtGui.QLabel()
        self.textQVBoxLayout.addWidget(self.textUpQLabel)
        self.textQVBoxLayout.addWidget(self.textDownQLabel)
        self.allQHBoxLayout  = QtGui.QHBoxLayout()
        self.iconQLabel      = QtGui.QLabel()
        self.allQHBoxLayout.addWidget(self.iconQLabel, 0)
        self.allQHBoxLayout.addLayout(self.textQVBoxLayout, 1)
        self.setLayout(self.allQHBoxLayout)
        # setStyleSheet
        self.textUpQLabel.setStyleSheet('''
            color: rgb(0, 0, 255);
        ''')
        self.textDownQLabel.setStyleSheet('''
            color: rgb(255, 0, 0);
        ''')

    def setTextUp (self, text):
        self.textUpQLabel.setText(text)

    def setTextDown (self, text):
        self.textDownQLabel.setText(text)

    def setIcon (self, imagePath):
        self.iconQLabel.setPixmap(QtGui.QPixmap(imagePath))

class exampleQMainWindow (QtGui.QMainWindow):
    def __init__ (self):
        super(exampleQMainWindow, self).__init__()
        # Create QListWidget
        self.myQListWidget = QtGui.QListWidget(self)
        for index, name, icon in [
            ('No.1', 'Meyoko',  'icon.png'),
            ('No.2', 'Nyaruko', 'icon.png'),
            ('No.3', 'Louise',  'icon.png')]:
            # Create QCustomQWidget
            myQCustomQWidget = QCustomQWidget()
            myQCustomQWidget.setTextUp(index)
            myQCustomQWidget.setTextDown(name)
            myQCustomQWidget.setIcon(icon)
            # Create QListWidgetItem
            myQListWidgetItem = QtGui.QListWidgetItem(self.myQListWidget)
            # Set size hint
            myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
            # Add QListWidgetItem into QListWidget
            self.myQListWidget.addItem(myQListWidgetItem)
            self.myQListWidget.setItemWidget(myQListWidgetItem, myQCustomQWidget)
        self.setCentralWidget(self.myQListWidget)

app = QtGui.QApplication([])
window = exampleQMainWindow()
window.show()
sys.exit(app.exec_())

欢迎任何帮助。

【问题讨论】:

    标签: python pyqt5 sys qlistwidget qlistwidgetitem


    【解决方案1】:

    PyQt4 和 PyQt5 的区别https://docs.huihoo.com/pyqt/PyQt5/pyqt4_differences.html#differences-between-pyqt4-and-pyqt5

    import sys
    #from PyQt4 import QtGui
    from PyQt5 import QtGui, QtWidgets
    
    
    class QCustomQWidget (QtWidgets.QWidget):                       # QtWidgets
        def __init__ (self, parent = None):
            super(QCustomQWidget, self).__init__(parent)
            self.textQVBoxLayout = QtWidgets.QVBoxLayout()          # QtWidgets
            self.textUpQLabel    = QtWidgets.QLabel()               # QtWidgets
            self.textDownQLabel  = QtWidgets.QLabel()               # QtWidgets
            self.textQVBoxLayout.addWidget(self.textUpQLabel)
            self.textQVBoxLayout.addWidget(self.textDownQLabel)
            self.allQHBoxLayout  = QtWidgets.QHBoxLayout()          # QtWidgets
            self.iconQLabel      = QtWidgets.QLabel()               # QtWidgets
            self.allQHBoxLayout.addWidget(self.iconQLabel, 0)
            self.allQHBoxLayout.addLayout(self.textQVBoxLayout, 1)
            self.setLayout(self.allQHBoxLayout)
            # setStyleSheet
            self.textUpQLabel.setStyleSheet('''
                color: rgb(0, 0, 255);
            ''')
            self.textDownQLabel.setStyleSheet('''
                color: rgb(255, 0, 0);
            ''')
    
        def setTextUp (self, text):
            self.textUpQLabel.setText(text)
    
        def setTextDown (self, text):
            self.textDownQLabel.setText(text)
    
        def setIcon (self, imagePath):
            self.iconQLabel.setPixmap(QtGui.QPixmap(imagePath).scaled(60, 60))   # + .scaled(60, 60
    
    class exampleQMainWindow (QtWidgets.QMainWindow):                            # QtWidgets
        def __init__ (self):
            super(exampleQMainWindow, self).__init__()
            # Create QListWidget
            self.myQListWidget = QtWidgets.QListWidget(self)                     # QtWidgets
            for index, name, icon in [
                ('No.1', 'Meyoko',  'lena-2.png'),
                ('No.2', 'Nyaruko', 'im.png'),
                ('No.3', 'Louise',  'Ok.png')]:
                # Create QCustomQWidget
                myQCustomQWidget = QCustomQWidget()
                myQCustomQWidget.setTextUp(index)
                myQCustomQWidget.setTextDown(name)
                myQCustomQWidget.setIcon(icon)
                # Create QListWidgetItem
                myQListWidgetItem = QtWidgets.QListWidgetItem(self.myQListWidget)  # QtWidgets
                # Set size hint
                myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
                # Add QListWidgetItem into QListWidget
                self.myQListWidget.addItem(myQListWidgetItem)
                self.myQListWidget.setItemWidget(myQListWidgetItem, myQCustomQWidget)
            self.setCentralWidget(self.myQListWidget)
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication([])                                           # QtWidgets
        window = exampleQMainWindow()
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • myQListWidgetItem = QtWidgets.QListWidgetItem(self.myQListWidget) 这是我不明白的唯一一行。这会将项目实例化为列表、列表的子项还是其他内容?
    • 我已成功创建自定义小部件列表。我该如何继续以有效的方式删除它(列表是动态的)?我尝试了 myQListWidget.removeItemWidget(myQCustomQWidget) 但它丢弃了错误“参数 1 具有意外类型'myQCustomQWidget'。我必须保留并使用 myQListWidgetItem 变量还是有更有效的方法?
    • @MichaelEffraimidis 如果您有其他问题,您应该创建一个新问题。
    猜你喜欢
    • 2021-08-25
    • 2023-04-02
    • 1970-01-01
    • 2010-10-31
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多