是的,我知道這聽起來很瘋狂。但情況就是這樣。如果調用setTabText(),則不會刷新列表視圖
我編寫了一個重現錯誤的最小代碼。代碼使用QTabWidget
創建主窗口,而該窗口又有一個帶QListView
的選項卡和一個按鈕。列表視圖連接到QAbstractListModel
。最初,列表模型包含空列表。如果用戶點擊一個按鈕,它將被填充3個元素併發出相應的信號。在此信號上,選項卡小部件發出帶有新標題的信號,該信號被QMainWindow
捕獲並用於更改標籤標題。
所以,問題是,如果我用這個新標題呼叫setTabText()
,列表視圖保持空白,直到我點擊它(然後立即出現新的項目)。如果我在setWindowTitle()
中使用新標題,則在按下按鈕後,新項目將顯示在列表視圖中。我做錯了什麼,或者在QTabWidget
(或Python映射)中是否存在一些錯誤?
代碼如下:(?也許這就是問題所在,我需要使用4.5)
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, Python 3.1。
它也使用Qt + C++(4.5.3和4.6)重現,所以不是pyQt問題。無論如何,我提交了一個Qt的錯誤。 – fjarri 2009-12-06 12:31:30