1

グリッド レイアウトに 3 つのウィジェットが含まれています。それらをクリックすると、列の位置を取得したいのですが、ウィジェット自体のプロパティが見つからず、アクセスしてもコンテナーを取得できないようですwidget.parentWidget()

itemAt などの間接的な方法を使用することもできますが、より複雑でない方法を見つけたいと思います。

4

2 に答える 2

7

項目がどこにあるかを 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)
于 2012-10-23T05:25:17.733 に答える
1

現実的な (?) 疑似コードが続きます。ただし、テストされていません。

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();
于 2012-10-23T05:14:36.640 に答える