为什么样式表会影响 QTableWidget 的行为?

Why do stylesheets influence QTableWidget behaviour?

我使用 python2.7 和 PyQt4。我创建了一个带有按钮框和 table 小部件的简单应用程序。如果我编辑 table 单元格并按下 Ok 按钮,单元格编辑器总是会消失。但是在我添加 app.setStyleSheet(s) 行之后,单元格编辑器在按下 OK 按钮后并没有消失。这是怎么回事?

import sys
from PyQt4 import QtGui


class Widget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)

        l = QtGui.QVBoxLayout(self)

        table = QtGui.QTableWidget()

        table.setColumnCount(3)
        table.setRowCount(5)

        l.addWidget(table)

        l.addWidget(QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel))


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    s = "QWidget{background:red;}"
    # app.setStyleSheet(s)
    app.setStyleSheet(s)

    mw = QtGui.QMainWindow()
    w = Widget()
    mw.setCentralWidget(w)
    mw.show()

    sys.exit(app.exec_())

这似乎是 Qt4 中的一个错误,但我找不到针对它的具体报告。相同的代码在使用 PyQt5 时按预期工作,因此它在某些时候以某种方式得到修复。

错误实际上在 QDialogButtonBox 而不是 QTableWidget。如果您在示例中添加 QLineEdit 并在其上设置焦点,您将看到单击“确定”按钮不会切换焦点。或者更准确地说,单击 first 按钮不会切换焦点。按钮框中的所有其他按钮都正常工作。

我认为这可能与 default and/or autoDefault 属性有关,因为它们通常会改变按钮的样式(例如突出显示的边框)。但是设置属性没有任何效果 - 这个错误似乎确实只影响 first 按钮。