我有一个带有QGridLayout作为布局的PyQt4应用程序。此布局中包含n个小部件,每个小部件位于另一行,但不在另一列上。我使用构造函数创建了所有小部件。我想知道,如何在网格布局中获取窗口小部件的行号,这样当我点击它时,它会得到该数字,我可以在我的代码中进一步使用它。
代码如下所示:
...
class sampleWidget(QWidget):
def __init__(self):
QWidget.__init__(self)
...
self.show()
....
class mainClass(QWidget):
def __init__(self):
QWidget.__init__(self)
layout = QGridLayout()
self.setLayout(layout)
for i in xrange(10):
widget = sampleWidget()
widget.setObjectName("samplewidget" + i)
layout.addWidget(i, 0)
self.show()
....
我已经完成了所有必要的导入以及运行该程序所需的所有内容,请不要担心。我唯一担心的是如何获取创建的小部件的行号。
如果有人愿意帮助我,我将非常感激!
度过美好的一天。
答案 0 :(得分:2)
我可能会遗漏一些明显的东西但这至少是一种方法。
编辑:我对第一个建议感到不满意。因此改变了它。关于这个问题可能有点落伍,但应该说明如何获得你要求的信息。
from PyQt4 import QtGui, QtCore
import sys, collections
pos = collections.namedtuple("pos", ("row, column"))
class Widget(QtGui.QWidget):
itemSelected = QtCore.pyqtSignal(QtGui.QWidget, pos)
def __init__(self):
super(Widget, self).__init__()
layout = QtGui.QGridLayout(self)
for y in range(0, 11):
layout.addWidget(QtGui.QLabel("Row: %d" % y, self), y, 0)
for x in range(1,4):
layout.addWidget(QtGui.QLabel("QLabel"), y, x)
self.itemSelected.connect(self.onItemSelected)
def mousePressEvent(self, event):
widget = self.childAt(event.pos())
if isinstance(widget, QtGui.QLabel): # Or whatever type you are looking for
self._handleEvent(widget)
return QtGui.QWidget.mousePressEvent(self, event)
def _handleEvent(self, widget):
layout = self.layout()
index = layout.indexOf(widget)
row, column, cols, rows = layout.getItemPosition(index)
self.itemSelected.emit(widget, pos(row, column))
def onItemSelected(self, widget, pos):
print "%s at %s" % (widget, pos)
if __name__ == "__main__":
app = QtGui.QApplication([])
wnd = Widget()
wnd.show()
sys.exit(app.exec_())