グリッド レイアウトに 3 つのウィジェットが含まれています。それらをクリックすると、列の位置を取得したいのですが、ウィジェット自体のプロパティが見つからず、アクセスしてもコンテナーを取得できないようですwidget.parentWidget()
itemAt などの間接的な方法を使用することもできますが、より複雑でない方法を見つけたいと思います。
項目がどこにあるかを QGridLayout に尋ねるだけです。次に例を示します。
class Widget(QtGui.QWidget):
def __init__(self):
super(Widget, self).__init__()
self.resize(600,600)
self.layout = QtGui.QGridLayout(self)
for row in xrange(3):
for col in xrange(3):
button = QtGui.QPushButton("Button %d-%d" % (row,col))
button.clicked.connect(self.buttonClicked)
self.layout.addWidget(button, row, col)
def buttonClicked(self):
button = self.sender()
idx = self.layout.indexOf(button)
location = self.layout.getItemPosition(idx)
print "Button", button, "at row/col", location[:2]
知る必要があるのは、どのウィジェットがクリックされたかだけです。次に、 でレイアウト インデックスを検索できますlayout.indexOf(widget)
。(row, col, rowspan, colspan)
インデックスを使用すると、実際の使用を検索できますlayout.getItemPosition(index)
リストの内容全体をループする必要はありません。また、このアプローチでは、アイテムが作成されたときに格納された列の位置とは対照的に、現在の場所を取得します。アイテムは、追加後いつでもレイアウト内で移動できます。
呼び出し元のウィジェットが誰であるかを尋ねる必要があるため、self.sender()
アプローチが「非 Pythonic」であることがわかった場合は、各コールバックを実際のボタン ウィジェットと事前にパッケージ化するアプローチを使用することもできます。
from functools import partial
class Widget(QtGui.QWidget):
def __init__(self):
...
for col in xrange(3):
button = QtGui.QPushButton("Button %d-%d" % (row,col))
cbk = partial(self.buttonClicked, button)
button.clicked.connect(cbk)
...
def buttonClicked(self, button):
idx = self.layout.indexOf(button)
現実的な (?) 疑似コードが続きます。ただし、テストされていません。
int getColoumOfWidgetInGridLayout(QGridLayout* layout, QWidget* widget)
{
for(int row=0; row<layout->rowCount(); ++row) {
for(int col=0; col<layout->columnCount(); ++col) {
if(layout->itemAtPosition(row, col)->widget()==widget) {
return col;
}
}
}
return -1;
}
しかし、複雑な場合は、QObject::setProperty() を使用して、グリッド レイアウトを構築するときに列番号を格納します。つまり、
myWidget->setProperty("GridColumn", column);
myGridLayout->addWidget(myWidget, row, column);
そして、保存された値を次のように取得できます
myWidget->property("GridColumn").toInt();