2009-11-29 51 views
0

是的,我知道這聽起來很瘋狂。但情況就是這樣。如果調用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。

回答

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 port中的一個bug。如果你不能在Windows或Linux下嘗試更新的qt版本。

+0

它也使用Qt + C++(4.5.3和4.6)重現,所以不是pyQt問題。無論如何,我提交了一個Qt的錯誤。 – fjarri 2009-12-06 12:31:30