【问题标题】:PyQt4 how do I find the row number of a Widget in a QGridLayout?PyQt4 如何在 QGridLayout 中找到 Widget 的行号?
【发布时间】:2011-04-04 06:53:58
【问题描述】:

我有一个以 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()

 ....

我已经完成了所有必要的导入以及运行程序所需的所有内容,不用担心。我唯一担心的是如何获取创建的小部件的行号。

如果有人愿意帮助我,我将非常感激!

祝你有美好的一天。

【问题讨论】:

    标签: get widget row pyqt4 grid-layout


    【解决方案1】:

    我可能遗漏了一些明显的东西,但这至少是一种方法。
    编辑:我对我的第一个建议不满意。因此改变了它。关于这个问题可能有点过火,但应该说明如何获取您要求的信息。

    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_())
    

    【讨论】:

    • 谢谢!这正是我所寻找的。这解决了我的问题!
    • 旧,但不错。随着导入的改变,它也适用于 PyQt5。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多