Qt获取点击项目的列位置

时间:2012-10-22 22:25:47

标签: qt pyqt pyqt4

我有三个小部件包含在网格布局中。当我点击它们时,我想获得它们的列位置,但我找不到小部件本身的任何属性,并且似乎无法通过访问widget.parentWidget()来获取容器

我可以使用一些间接的方式,例如itemAt,但我宁愿找到一种不那么复杂的方法。

2 个答案:

答案 0 :(得分:4)

您可以简单地询问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()方法“unpythonic”,因为您必须询问调用小部件是谁,您还可以使用将每个回调与实际按钮小部件打包的方法:

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)

答案 1 :(得分: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();