我有一些布尔变量。每个变量都与一个字符串消息相关联。 如果变量为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
答案 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()
告诉视图按模型中的特定角色对行进行排序。当您修改模型以显示行(并调用上面提到的函数)时,您还可以修改模型中用于确定排序顺序的角色的数据。
我没有在这里讨论太多细节,因为你说你只想要一些想法,但大部分都是来自另一个堆栈溢出帖子,所以请查看一下如果你需要一些更具体的示例代码(或者只是问一下)我和我会扩展你遇到的任何事情。)
答案 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()