【问题标题】:Message displaying in QListWidget/View on boolean condition在布尔条件下在 QListWidget/View 中显示消息
【发布时间】:2023-03-03 18:32:01
【问题描述】:

我有一些布尔变量。每个变量都与一个字符串消息相关联。 如果变量为 True,我想在 QListWidget(或 QListView)中显示消息,并在变量为 False 时隐藏它。

我还想按幻影出现的时间对这些消息进行排序。

你有一些关于如何做的想法/例子吗? 我不一定要找现成的程序,但至少要探索几条路径

谢谢!

编辑:

bMessage1, bMessage2, ... <= some boolean variables

sMessage1Text = "Message associated with bMessage1 variable"
sMessage2Text = "Message associated with bMessage2 variable"
...

(目前,我不知道将布尔变量与字符串变量相关联以执行我想要的操作的最佳方法。)

预期输出:

如果 bMessage1 变为 True,然后 bMessage2 变为,QlistView/Widget 应该显示:

Message associated with bMessage1 variable
Message associated with bMessage2 variable

如果 bMessage2 变为 True,然后 bMessage1 变为,QlistView/Widget 应该显示:

Message associated with bMessage2 variable
Message associated with bMessage1 variable

【问题讨论】:

    标签: python listview pyqt message-queue


    【解决方案1】:
    string_list = ["test1","test2","test3","test4"]
    variable_list = [True,True,False,True]
    display_list = [string_list[i] for i,v in enumerate(variable_list) if v]
    

    这是你要问的吗?

    【讨论】:

    • 是的,也许我可以用这样的东西填充 QlistView 模型。使用第三个时间戳列表进行排序。
    【解决方案2】:

    我建议将QListView 与模型一起使用。您可以通过创建QStandardItem() 并使用item.setData(data,role)QStandardItem 添加额外信息来填充模型

    您添加的额外信息应该是该行是否可见以及某种指示行排序顺序的索引(整数/时间戳/其他)。每条信息对应一个不同的角色,因此您可以将角色QtCore.Qt.UserRole + 1 分配给行是否可见,将QtCore.Qt.UserRole + 2 分配给排序信息。

    然后您可以编写一个函数,该函数使用listview.setRowHidden() 在您修改模型时更新行是显示还是隐藏。

    最后,您可以使用model.setSortRole() 告诉视图按模型中的特定角色对行进行排序。当您修改模型以显示一行时(并调用上面提到的函数),您还可以修改模型中的数据以用于确定排序顺序的角色。

    我没有在这里详细说明,因为您说您只是想要一些想法,但其中大部分来自另一个堆栈溢出帖子,因此请查看您是否需要一些更具体的示例代码(或者只是询问我和我会扩展您遇到的任何问题)。

    见:How to sort items in Qt QListview using Qt.UserRole

    【讨论】:

    • 谢谢。我已经更新了我的帖子。现在,我坚持使用 setRowHidden 函数。也许我可以清除模型并重新填充它,但我认为这不是一个好的解决方案。你还有一个吗?
    • 你被setRowHidden 卡住是什么意思?它工作不正常吗?怎么会这样?也许您可以在 pastebin 之类的东西上发布一个完整的示例 python 文件,这样我就可以更好地理解(尝试破译您在下面的答案中发布的代码很困难,因为它被分解成块并且不清楚它们是如何组合在一起的)
    【解决方案3】:

    我终于找到了解决办法:

    我将消息存储为一个将变量名称与信息相关联的字典(隐藏状态的布尔值、消息标签字符串、排序信息):

    self.aMessages = {"bMessage1": [False, "This is the message 1", 0],
                      "bMessage2": [False, "This is the message 2", 0],
                      "bMessage3": [False, "This is the message 3", 0],
                      "bMessage4": [False, "This is the message 4", 0],
                      "bMessage5": [False, "This is the message 5", 0]}
    

    以及基于QStandardItemModel的模型:

    class MessageListModel(QtGui.QStandardItemModel):
        def __init__(self, parent=None, *args):
            QtGui.QStandardItemModel.__init__(self, parent, *args)
    
        def data(self, index, role):
            if not index.isValid():
                return QtCore.QVariant()
            elif role != QtCore.Qt.DisplayRole:
                if role == QtCore.Qt.BackgroundRole:
                    status = index.data(QtCore.Qt.UserRole)
                    if status == True:
                        return QtCore.QVariant(QtGui.QColor(QtCore.Qt.green))
                    elif status == False:
                        return QtCore.QVariant(QtGui.QColor(QtCore.Qt.red))
            return QtGui.QStandardItemModel.data(self, index, role)
    
        def addItem(self, label, value):
            item = QtGui.QStandardItem(label)
            item.setEditable(False)
            item.setData(value, QtCore.Qt.UserRole)
            item.setData(0, QtCore.Qt.UserRole + 1)
            item.setDropEnabled(False)
            self.appendRow(item)
    

    然后,模型填充:

    tm = MessageListModel()
    for msg in self.aMessages.itervalues():
        tm.addItem(msg[1], msg[0])
    ListView.setModel(tm)
    

    还有一个更新模型的线程:

    class MessagesUpdateThread(QtCore.QThread):
        def __init__(self):
            QtCore.QThread.__init__(self)
            self.exiting = False
    
        def __del__(self):
            self.exiting = True
            self.wait()
    
        def run(self):
            while not self.exiting:
                self.emit(QtCore.SIGNAL("updateMessages()"))
                self.sleep(1)
    

    还有用于更新和排序模型的槽:

    def updateMessages(self):
        MsgList = self.aMessages.values()
        model = self.ui.Messages.model()
    
        for i in xrange(len(MsgList)):
            value = MsgList[i][0]
    
            index = model.index(i, 0)
            model.setData(index, MsgList[i][1])
            model.setData(index, value, QtCore.Qt.UserRole)
            model.setData(index, MsgList[i][2], QtCore.Qt.UserRole + 1)
            self.ui.Messages.setRowHidden(i, not value)
        del MsgList
        model.setSortRole(QtCore.Qt.UserRole + 1)
        model.sort(0)
    

    然后将槽连接到线程信号:

    self.m = MessagesUpdateThread()
    QtCore.QObject.connect(self.m, QtCore.SIGNAL("updateMessages()"), self.updateMessages)
    self.m.start()
    

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2022-01-18
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多