调用setTabText()时列表视图未刷新
是的,我知道这听起来有点疯狂。但情况就是这样的。
我写了一段简单的代码来复现这个问题。代码创建了一个主窗口,里面有一个叫做 QTabWidget
的控件,这个控件里有一个标签页,标签页里有一个 QListView
和一个按钮。列表视图连接到 QAbstractListModel
。一开始,列表模型是空的。如果用户点击按钮,列表就会填充3个元素,并发出一个信号。这个信号会让标签控件发出一个新标题的信号,这个信号被 QMainWindow
捕获并用来更改标签的标题。
所以,问题是,如果我用这个新标题调用 setTabText()
,列表视图会保持空白,直到我点击它(然后新项目会立刻出现)。如果我在 setWindowTitle()
中使用新标题,列表视图的新项目会在按下按钮后立刻出现。我是不是做错了什么,还是说 QTabWidget
(或者 Python 的映射)有bug?
代码如下:
from PyQt4 import QtGui, QtCore
import sys
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setWindowTitle("Test")
self._tabbar = QtGui.QTabWidget()
self.setCentralWidget(self._tabbar)
tab = SearchWindow(self)
tab.titleChanged.connect(self._refreshTabTitle)
self._tabbar.addTab(tab, "Initial title")
def _refreshTabTitle(self, title):
# if line 1 is commented - no bug, if line 2 is commented - bug exists
self._tabbar.setTabText(0, title) # line 1
#self.setWindowTitle(title) # line 2
class SearchWindow(QtGui.QSplitter):
titleChanged = QtCore.pyqtSignal(str)
def __init__(self, parent):
QtGui.QSplitter.__init__(self, QtCore.Qt.Vertical, parent)
results_model = ResultsModel(self)
results_view = QtGui.QListView()
results_view.setModel(results_model)
self.addWidget(results_view)
search_button = QtGui.QPushButton(">>")
search_button.clicked.connect(results_model.refreshResults)
self.addWidget(search_button)
results_model.searchFinished.connect(self._refreshTitle)
def _refreshTitle(self):
self.titleChanged.emit("New title")
class ResultsModel(QtCore.QAbstractListModel):
searchFinished = QtCore.pyqtSignal()
def __init__(self, parent):
QtCore.QAbstractListModel.__init__(self, parent)
self._results = []
def rowCount(self, parent):
return len(self._results)
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid():
return None
elif index.row() = len(self._results):
return None
elif role == QtCore.Qt.DisplayRole:
return self._results[index.row()]
def refreshResults(self):
self._results = ['result1', 'result2', 'result3']
self.reset()
self.searchFinished.emit()
app = QtGui.QApplication(sys.argv)
wnd = MainWindow()
wnd.show()
sys.exit(app.exec_())
在 Mac OS 10.6.2、Qt SDK 2009.04 (4.5)、pyQt 4.6.1(也许这就是问题所在,我需要使用4.5吗?)、Python 3.1 上测试过。
1 个回答
0
我在使用Linux、Qt 4.5.3、pyQt 4.5.4和python 2.5.2的时候,没能重现你遇到的问题。
我觉得这个问题很可能和你使用的版本或平台有关。你可以试试在MacOS上使用Qt 4.5.3、pyQt 4.5.4和python 2.5.2。如果你能重现这个问题,那可能是MacOS上qt的移植版本有bug。如果不能重现,那你可以尝试在Windows或Linux上使用更新的qt版本。