2014-05-09 123 views
3

我的目標是爲multiple QPushButtoncellwidgetQTableWidget,每當在任何一個按鈕的用戶點擊,就會打印出和Column數字表是在。如何檢測在PyQt4中點擊QTableWidget的cellwidget用戶的行號和列號?

因此,對於1 QPushButton

import sys 
from PyQt4 import QtGui,QtCore 

def CurrentPos(): 
    clickme = QtGui.qApp.focusWidget() 
    index = table.indexAt(clickme.pos()) 
    if index.isValid(): 
     print (index.row(), index.column()) 

def AddValues(): 
    table.setRowCount(5) 
    for i in range(5): 
     button = QtGui.QPushButton('Click1') 
     table.setCellWidget(i,1,button) 
     button.clicked.connect(CurrentPos) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 

    table = QtGui.QTableWidget() 
    table.setFixedSize(QtCore.QSize(330,250)) 

    table.setEditTriggers(QtGui.QTableWidget.NoEditTriggers) 
    table.setSelectionBehavior(QtGui.QTableWidget.SelectRows) 
    table.setSelectionMode(QtGui.QTableWidget.NoSelection) 
    table.horizontalHeader().setStretchLastSection(True) 
    table.setFocusPolicy(QtCore.Qt.NoFocus) 

    table.setColumnCount(3) 
    table.setHorizontalHeaderLabels(['A','B','C']) 
    table.setColumnWidth(0,50) 
    table.setColumnWidth(1,200) 
    table.show() 

    AddValues() 

    app.exec_() 

enter image description here

當我點擊每個按鈕,它會打印出的行和列數就好了。但是,當我改變了功能AddValues以適應多個按鈕:

def AddValues(): 
    table.setRowCount(5) 
    for i in range(5): 
     button1 = QtGui.QPushButton('Click1') 
     button2 = QtGui.QPushButton('Click2') 
     button3 = QtGui.QPushButton('Click3') 

     button_layout = QtGui.QHBoxLayout()  
     button_layout.addWidget(button1) 
     button_layout.addWidget(button2) 
     button_layout.addWidget(button3) 

     buttons_widget = QtGui.QWidget() 
     buttons_widget.setLayout(button_layout) 

     table.setCellWidget(i,1,buttons_widget) 
     button1.clicked.connect(CurrentPos) 
     button2.clicked.connect(CurrentPos) 
     button3.clicked.connect(CurrentPos) 

enter image description here

它不再打印出正確的行數和列數了。相反,它將根據按鈕的位置打印(0,0)或(0,1)。

我試圖打印出QtGui.qApp.focusWidget(),這讓我<PyQt4.QtGui.QPushButton object at 0x014B56F0>從而據我瞭解,重點部件是實際QPushButton我點擊的不是命名buttons_widgetQWidget

我唯一的懷疑是.pos()方法返回相對於它的父窗口小部件,這是QWidget (buttons_widget)而不是QTableWidget本身的位置。但我似乎無法找到.pos()方法的文檔。

所以,我如何修改我的代碼,這樣,每當在任何3個按鍵的用戶點擊,它目前在打印出的行數和列數的按鈕。

我使用Windows XP SP3和Python 2.7。 3

回答

3

我找到了解決方案。

index = table.indexAt(clickme.parent().pos()) 

我應該檢查父QWidget的位置,而不是QPushButton

4
buttonClicked = self.sender() 
    index = self.table.indexAt(buttonClicked.pos()) 
    print index.row() 
+0

這將是很好,如果你可以提供你的代碼片段的簡短說明。 。 –

0

薩姆斯的答案就像一個魅力。 RITZ XAVI,它的工作原理如下:

  1. buttonClicked = self.sender() - 檢測出發送信號的構件

  2. postitionOfWidget = buttonClicked.pos() - 得到在x,y座標該發件人

  3. 指數= self.table.indexAt(postitionOfWidget) - 項目與將QTableWidget的座標

  4. 索引。這QTableWidget的

山姆內該項目的行()行,我不知道怎麼感謝你夠這個:-)

相關問題