【问题标题】:List view is not refreshed if setTabText() is called如果调用 setTabText(),则不会刷新列表视图
【发布时间】:2009-11-29 10:10:02
【问题描述】:

是的,我知道这听起来很疯狂。但情况是这样的。

我编写了一个最小的代码来重现这个错误。该代码使用QTabWidget 创建主窗口,该窗口又具有一个带有QListView 的选项卡和一个按钮。列表视图连接到QAbstractListModel。最初,列表模型包含空列表。如果用户单击一个按钮,它会填充 3 个元素并发出相应的信号。在这个信号上,标签小部件发出一个带有新标题的信号,该信号被QMainWindow 捕获并用于更改标签标题。

所以,问题是,如果我用这个新标题调用setTabText(),列表视图会一直为空,直到我点击它(然后新项目立即出现)。如果我在setWindowTitle() 中使用新标题,则新项目会在按下按钮后立即出现在列表视图中。我做错了什么,还是QTabWidget(或 Python 映射)中存在一些错误?

代码如下:

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 上测试。

【问题讨论】:

    标签: python qt pyqt pyqt4


    【解决方案1】:

    无法使用 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 版本。

    【讨论】:

    • 它也可以使用 Qt+C++ 进行复制(包括 4.5.3 和 4.6),所以不是 pyQt 问题。无论如何,我在 Qt 上提交了一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2011-08-31
    • 2011-03-18
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多