Представление списка не обновляется, если вызывается setTabText () - PullRequest
0 голосов
/ 29 ноября 2009

Да, я знаю, это звучит безумно. Но вот ситуация.

Я написал минимальный код, воспроизводящий ошибку. Код создает главное окно с QTabWidget, которое, в свою очередь, имеет одну вкладку с QListView и кнопку. Вид списка подключен к QAbstractListModel. Изначально модель списка содержит пустой список. Если пользователь нажимает на кнопку, она заполняется 3 элементами, и выдается соответствующий сигнал. По этому сигналу виджет вкладки генерирует сигнал с новым заголовком, который перехватывается QMainWindow и используется для изменения заголовка вкладки.

Итак, проблема в том, что, если я позвоню setTabText() с этим новым заголовком, представление списка останется пустым, пока я не нажму на него (тогда сразу же появятся новые элементы). Если вместо этого я использую новый заголовок в setWindowTitle(), новые элементы появляются в виде списка сразу после нажатия кнопки. Я что-то не так делаю, или есть какая-то ошибка в QTabWidget (или Python mapping)?

Код следующий:

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 голосов
/ 06 декабря 2009

Не удалось воспроизвести вашу проблему, используя Linux, Qt 4.5.3, pyQt 4.5.4, python 2.5.2.

Я думаю, это определенно зависит от версии / платформы. Вы должны попробовать Qt 4.5.3 + pyQt 4.5.4 + python 2.5.2 на MacOS. Если вы можете воспроизвести проблему, это больше похоже на ошибку в порте MacOS qt. Если вы не можете, попробуйте новые версии qt под Windows или Linux.

...