Pyqt - 在“图标模式”中添加到 QTreeView 项目时,自定义小部件上丢失了突出显示的选择

我正在尝试创建自定义小部件列表,用户单击它们以打开图片/电影。我一切正常,但我失去了通常随项目一起出现的选择突出显示。


我知道它不在那里,因为我使用的是自定义小部件。如何在小部件上获得选择突出显示?我希望该项目显示一层透明的蓝色。


奇怪的是,当我将视图模式更改为列表模式时,您可以看到蓝色选择。我已经在示例代码中注释掉了它。


他是一个条纹背的例子,以及条纹背,因为我无论如何都能得到它。切换列表视图并选择一个项目以查看不同的行为。


import sys

from datetime import datetime

from PyQt5 import QtWidgets

from PyQt5 import QtCore

from PyQt5 import QtGui



class EntryWidget(QtWidgets.QWidget):


    def __init__(self):

        super(EntryWidget, self).__init__()

        self.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))


        # controls

        self.thumbnail = QtWidgets.QLabel()

        self.version = QtWidgets.QLabel()

        self.date = QtWidgets.QLabel()

        self.name = QtWidgets.QLabel()

        self.name.setAlignment(QtCore.Qt.AlignCenter)

        self.author = QtWidgets.QLabel()

        self.author.setAlignment(QtCore.Qt.AlignRight)

        self.dummy = QtWidgets.QLabel(" ")


        # layout

        main_layout = QtWidgets.QVBoxLayout()


        main_layout.setContentsMargins(0, 0, 0, 0)

        main_layout.setSpacing(0)

        main_layout.addWidget(self.name)

        main_layout.addWidget(self.thumbnail)

        main_layout.addWidget(self.version)

        main_layout.addWidget(self.date)

        main_layout.addWidget(self.author)

        main_layout.addWidget(self.dummy)

        main_layout.addStretch()


        self.setLayout(main_layout)


    def set_size(self, w, h):

        self.thumbnail.setFixedSize(w, h)


    def set_version(self, name):

        self.version.setText(" Version:" + str(name))


    def set_date(self, name):

        date_string = " Date: {0}/{1}/{2}\n Time: {3}:{4}:{5}".format(

            str(name.day).zfill(2),

            str(name.month).zfill(2),

            name.year,

            name.hour,

            name.minute,

            name.second)

        self.date.setText(date_string)


    def set_name(self, name):

        self.name.setText(name)


    def set_author(self, name):

        self.author.setText(name + " ")


胡子哥哥
浏览 86回答 1
1回答

子衿沉夜

好吧,我已经找到了一种行之有效的方法。我在QListWidgetItem中添加了一些空白文本,并使字体变得非常大。这带回了项目的突出显示。media_item.setText("  ") # set the item with a  dummy stringmedia_item.setFont(QFont('Verdana', 180)) # make the font big so it covers the whole widget经过一些研究,我发现使用QListView和Q代表是做到这一点的方法。我找不到使用PyQt5的好例子/教程,所以我现在只使用它。这是代码from PyQt5.QtCore    import *from PyQt5.QtGui     import *from PyQt5.QtWidgets import *from sys      import exit     as sysExitfrom datetime import datetime as dtDateTimeclass EntryWidget(QWidget):    def __init__(self):        QWidget.__init__(self)        self.setCursor(QCursor(Qt.PointingHandCursor))        self.setFocusPolicy(Qt.StrongFocus)  # Sets the Highlight when it has focus      # Controls        self.thumbnail = QLabel()        self.version = QLabel()        self.date = QLabel()        self.name = QLabel()        self.name.setAlignment(Qt.AlignCenter)        self.author = QLabel()        self.author.setAlignment(Qt.AlignRight)        self.dummy = QLabel(" ")      # Layout Container        VBox = QVBoxLayout()        VBox.setContentsMargins(0, 0, 0, 0)        VBox.setSpacing(0)        VBox.addWidget(self.name)        VBox.addWidget(self.thumbnail)        VBox.addWidget(self.version)        VBox.addWidget(self.date)        VBox.addWidget(self.author)        VBox.addWidget(self.dummy)        VBox.addStretch()        self.setLayout(VBox)    def set_size(self, w, h):        self.thumbnail.setFixedSize(w, h)    def set_version(self, name):        self.version.setText(" Version:" + str(name))    def set_date(self, name):        date_string = " Date: {0}/{1}/{2}\n Time: {3}:{4}:{5}".format(            str(name.day).zfill(2),            str(name.month).zfill(2),            name.year,            name.hour,            name.minute,            name.second)        self.date.setText(date_string)    def set_name(self, name):        self.name.setText(name)    def set_author(self, name):        self.author.setText(name + " ")class QuickExample(QDialog):    def __init__(self):        QDialog.__init__(self)        self.resize(500, 500)        media_list = QListWidget(self)        # switch the views and select an item        media_list.setViewMode(QListWidget.IconMode)        media_list.setResizeMode(QListWidget.Adjust)        media_list.setMovement(QListWidget.Static)        media_list.setSpacing(5)        # dummy media, usually sourced from database        media = [            {"version": 1, "date": dtDateTime.now(), "name": "Entry 01", "author": "Bob"},            {"version": 2, "date": dtDateTime.now(), "name": "Entry 02", "author": "John"}        ]        for i in media:            # Create media Entry            entry = EntryWidget()            entry.set_version(i["version"])            entry.set_date(i["date"])            entry.set_size(128, 72)            entry.set_name(i["name"])            entry.set_author(i["author"])            # Create QListWidgetItem            media_item = QListWidgetItem(media_list)            ###########            # the fix #            ###########            media_item.setText("  ") # set the item with a dummy string            media_item.setFont(QFont('Verdana', 180)) # make the font big so it covers the whole widget            # Set size hint            media_item.setSizeHint(entry.sizeHint())            # Add QListWidgetItem into QListWidget            media_list.addItem(media_item)            media_list.setItemWidget(media_item, entry)        VBox = QVBoxLayout()        VBox.addWidget(media_list)        self.setLayout(VBox)if __name__ == "__main__":    MainEventHandler = QApplication([])    MainApplication = QuickExample()    MainApplication.show()    sysExit(MainEventHandler.exec_())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python