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
,我会得到基本相同的行为。