消息显示在布尔条件下的QListWidget / View中

时间:2013-10-18 18:40:57

标签: python listview pyqt message-queue

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

我还希望在幻影出现之前对这些消息进行排序。

您对如何操作有一些想法/示例吗? 我不一定在寻找现成的程序,但至少要探索一些路径

谢谢!

编辑:

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

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

(现在,我不知道这是将boolean var与字符串var关联起来做我想要的最佳方法。)

预期产出:

如果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

3 个答案:

答案 0 :(得分: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]

这就是你问的问题吗?

答案 1 :(得分:1)

我建议将QListView与模型一起使用。您可以通过创建QStandardItem()并使用QStandardItem

item.setData(data,role)添加额外信息来填充模型

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

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

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

我没有在这里讨论太多细节,因为你说你只想要一些想法,但大部分都是来自另一个堆栈溢出帖子,所以请查看一下如果你需要一些更具体的示例代码(或者只是问一下)我和我会扩展你遇到的任何事情。)

请参阅:How to sort items in Qt QListview using Qt.UserRole

答案 2 :(得分:0)

我终于找到了解决方案:

我将消息存储为dict,它将变量名称与信息相关联(布尔值用于隐藏状态,消息标签字符串,排序顺序信息):

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()