【问题标题】:Focus on multiple widgets专注于多个小部件
【发布时间】:2019-12-12 11:36:44
【问题描述】:

我的主窗口中有一个带有多个小部件的 GUI。我有一个更具体的QTableWidget 和一个QTableView,其中包含可选择的行。如果我在第一个表中选择一行,然后在第二个表中选择另一个,我会失去对第一个表的关注,因此所选行上没有蓝色背景。

我目前拥有的是:

或这个:

我想要的是这个:

我该怎么做?

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    您必须使用 QProxyStyle 来确定当视图是否聚焦时所选项目的绘制是相同的。

    from PyQt5 import QtGui, QtWidgets
    
    
    class ProxyStyle(QtWidgets.QProxyStyle):
        def drawPrimitive(self, element, option, painter, widget=None):
            if element == QtWidgets.QStyle.PE_PanelItemViewRow:
                if option.state & QtWidgets.QStyle.State_Selected:
                    option.state |= QtWidgets.QStyle.State_Active
            super().drawPrimitive(element, option, painter, widget)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
    
        tablewidget = QtWidgets.QTableWidget(10, 6)
    
        model = QtGui.QStandardItemModel(10, 6)
        tableview = QtWidgets.QTableView()
        tableview.setModel(model)
    
        for table in (
            tablewidget,
            tableview,
        ):
            table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
            table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
            table.setStyle(ProxyStyle(table.style()))
    
        w = QtWidgets.QWidget()
        lay = QtWidgets.QHBoxLayout(w)
        lay.addWidget(tablewidget)
        lay.addWidget(tableview)
        w.show()
    
        sys.exit(app.exec_())
    

    您也可以使用委托:

    from PyQt5 import QtGui, QtWidgets
    
    
    class Delegate(QtWidgets.QStyledItemDelegate):
        def initStyleOption(self, option, index):
            super().initStyleOption(option, index)
            if option.state & QtWidgets.QStyle.State_Selected:
                option.state |= QtWidgets.QStyle.State_Active
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
    
        tablewidget = QtWidgets.QTableWidget(10, 6)
    
        model = QtGui.QStandardItemModel(10, 6)
        tableview = QtWidgets.QTableView()
        tableview.setModel(model)
    
        for table in (
            tablewidget,
            tableview,
        ):
            table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
            table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
            delegate = Delegate(table)
            table.setItemDelegate(delegate)
    
        w = QtWidgets.QWidget()
        lay = QtWidgets.QHBoxLayout(w)
        lay.addWidget(tablewidget)
        lay.addWidget(tableview)
        w.show()
    
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      您需要将qtablewidgetitemSelectionChanged 信号连接到您有逻辑选择另一个小部件中的行的插槽。

      类似

      tblwidget.itemSelectionChanged.connect(handleSelection)
      

      并在其中定义一个名为handleSelection 的插槽

      def handleSelection(self):
          .... logic for selecting the current row
          .. of the other widget
      

      【讨论】:

      • 也许我不够清楚......这两个表是独立的。如果我选择一个表的一行,我不希望发生一些特别的事情,除了不移除另一个表上的焦点(我想在所选行上保留蓝色黑色背景)。
      猜你喜欢
      • 1970-01-01
      • 2012-06-22
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      相关资源
      最近更新 更多