2011-04-03 55 views
0

我有一個使用QGridLayout作爲佈局的PyQt4應用程序。該佈局中有n個小部件,每個小部件在另一行上,但不在另一列上。我已經使用構造函數創建了所有的小部件。我想知道,我如何獲得網格佈局中的小部件的行號,以便當我點擊它時,它會得到這個數字,我可以在我的代碼中進一步使用它。PyQt4如何找到QGridLayout中的Widget的行號?

的代碼看起來是這樣的:

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

.... 

我已經做了一切必要的進口,都需要什麼來運行程序,不用擔心。我唯一擔心的是如何獲得創建的小部件的行號。

如果有人願意幫助我,我將不勝感激!

祝您有美好的一天。

回答

2

我可能會錯過一些明顯的東西,但這至少是一種方式。
編輯:我對我的第一個建議不滿意。因此改變了它。對於這個問題,可能會有點過分,但應該展示如何獲取您要求的信息。

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

謝謝!這正是我所期待的。這解決了我的問題! – Calin 2011-04-04 12:09:15

+0

舊的,但很好。隨着進口改變,它也與PyQt5一起工作。 – sascha 2017-07-02 13:18:21