0

我有一些布尔变量。每个变量都与一个字符串消息相关联。如果变量为 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
4

3 回答 3

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]

这就是你要问的吗?

于 2013-10-18T18:46:55.190 回答
1

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

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

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

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

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

请参阅:如何使用 Qt.UserRole 对 Qt QListview 中的项目进行排序

于 2013-10-19T03:16:53.380 回答
0

我终于找到了解决方案:

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

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-10-30T16:35:55.170 回答