Python 选择/单击QScrollArea条目时会发出何种信号?

Python 选择/单击QScrollArea条目时会发出何种信号?,python,pyqt4,Python,Pyqt4,我花了很长时间弄清楚在以下情况下会发出什么样的信号: 基本上,这是包含多个QTableWidgets的QScrollArea: class ScrollArea(QtGui.QScrollArea): def __init__(self): super(ScrollArea, self).__init__() self.scroll_widget = QtGui.QWidget() self.scroll_layout = QtGui.Q

我花了很长时间弄清楚在以下情况下会发出什么样的信号:

基本上,这是包含多个
QTableWidget
s的
QScrollArea

class ScrollArea(QtGui.QScrollArea):
    def __init__(self):
        super(ScrollArea, self).__init__()
        self.scroll_widget = QtGui.QWidget()
        self.scroll_layout = QtGui.QVBoxLayout()
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setWidgetResizable(True)
        self.__create_content()
        self.setWidget(self._content_widget)
        self.scroll_layout.addWidget(self)
        self.scroll_widget.setLayout(self.scroll_layout)

    def __create_content(self):
        self._content_widget = QtGui.QWidget()
        self._content_widget_layout = QtGui.QVBoxLayout()
        self._content_widget.setLayout(self._content_widget_layout)

    def add_item(self, item):
        self._content_widget_layout.addWidget(item)
我正在为
QApplication
使用
Plastique
样式。从上图可以看出,当在
QScrollArea
内单击一个项目时,蓝色边框出现。我想知道的是,在绘制边界时会发出哪个信号?我需要这些信息,这样每当单击按钮(左侧)时,我就可以将一行附加到所选的
QTableWidget


您还可以看到每个表中都有一个“x”,当按下“x”时,
QTableWidget
将从
qscrolrea
中删除。如果前面的问题有解决方案,我也可以根据用户选择删除
QTableWidget
,而不是用户单击“x”。

要获得具有焦点的小部件,您可以使用
QApplication
focusChanged
信号:

from PyQt4 import QtCore, QtGui


class HorizontalHeader(QtGui.QHeaderView):
    def __init__(self, parent=None):
        super(HorizontalHeader, self).__init__(QtCore.Qt.Horizontal, parent)
        self.button = QtGui.QToolButton(self, text="x")
        self.sectionResized.connect(self.handleSectionResized)

    def handleSectionResized(self):
        last_ix = self.count() - 1
        pos = QtCore.QPoint(self.sectionViewportPosition(last_ix) + self.sectionSize(last_ix) , 0)
        self.button.move(pos)

    def showEvent(self, event):
        self.handleSectionResized()
        super(HorizontalHeader, self).showEvent(event)


class TableView(QtGui.QTableView):
    def __init__(self, *args, **kwargs):
        super(TableView, self).__init__(*args, **kwargs)
        header = HorizontalHeader(self)
        header.button.clicked.connect(self.deleteLater)
        self.setHorizontalHeader(header)
        QtGui.qApp.focusChanged.connect(self.onFocusChanged)

    def onFocusChanged(self, old, new):
        if new == self:
            self.deleteLater()

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    scrollArea = QtGui.QScrollArea()
    scrollArea.setWidgetResizable(True)
    widget = QtGui.QWidget()
    scrollArea.setWidget(widget)
    lay = QtGui.QVBoxLayout(widget)

    for i in range(10):
        w = TableView()
        model = QtGui.QStandardItemModel(4, 2, w)
        w.setModel(model)
        lay.addWidget(w)

    scrollArea.show()
    sys.exit(app.exec_())

没有信号-它表示焦点,因此有一个。我认为没有必要使用焦点来解决“X”按钮的问题,相反,如果您提供如何使用“X”创建QTableWidget的代码,它会变得更复杂,因为它必须被过滤按钮,您将得到一个简单的解决方案。目前,我在
horizontalHeader()
上使用
sectionClicked()
,当在每个水平标题上单击第2节时,我将从布局中删除特定的小部件,并在
QTableWidget
上调用
deleteLater()
,效果很好。如果我在
horizontalHeader
中添加
QPushButton
,我会得到基本相同的行为。