0

レイアウトとして 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()

 ....

必要なすべてのインポートと、プログラムを実行するために必要なものはすべて作成しました。心配はいりません。私の唯一の心配は、作成されたウィジェットの行番号を取得する方法です。

誰かが私を助けてくれるなら、私はとても感謝しています!

すてきな一日を。

4

1 に答える 1

2

明らかな何かが欠けているかもしれませんが、これは少なくとも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_())
于 2011-04-03T20:08:48.377 に答える