PyQt:如何获取QCombobox的单元格位置,这是一个QTableWidgetItem

时间:2018-03-14 22:31:25

标签: python pyqt pyqt4

所以下面的代码是更大项目的一部分,但总的来说,我有一个QTableWidget,它是从数据库中填充的。其中一个项目是组合框,当用户从组合框中选择里程碑选项时,我希望能够知道所选择的组合框所在的行和列,以便我可以将固定速率应用于a的值。同一行中的单元格。我需要帮助的是如何跟踪所选组合框所在的单元格(行,列)。

请注意我使用未显示的其他标签,这就是为什么我的代码按原样设置的原因。我找到了一些其他的帮助,但我不是一个非常有经验的python程序员,所以我卡住了。

#!/usr/local/bin/python
# -*- coding: latin9 -*-
import sys, os , random
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import pyqtSlot,SIGNAL,SLOT
import time
import json
import openpyxl
import Lists

class CashflowTab(QtGui.QDialog):
    '''
    Parent for all tab widgets of the REPO GUI
    '''
    def __init__(self, parent = None):
        super(CashflowTab, self).__init__()
        if parent != None:
            self.setParent(parent)
        self.initUI()
        self.loadSettings()

    def loadSettings(self):
        '''
        read settings and read db
        '''
        fh = open('settings.json')
        self.settings = json.load(fh)
        fh.close()
        #load db
        dbpath = self.settings['dbpath']
        self.db = Lists.SQLiteHandler(dbpath)
        self.repo = Lists.WCNList('ROSQL')

        try:
            self.db.read(self.repo)
        except:
            pass

class WCNSelectTab(CashflowTab):
    '''
    Window for WCN selection
    '''
    def __init__(self, parent = None):
        super(WCNSelectTab, self).__init__(parent)
        if parent != None:
            self.setParent(parent)


    def initUI(self):
        global wbsitem, WCNSelectTab_object, linequerycheck
        linequerycheck = 'False'
        wbsitem = 'null'
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("cleanlooks"))
        gbox = QtGui.QGridLayout(self)

        self.projectlist = QtGui.QTableWidget()
        self.projectlist.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        #self.projectlist.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.projectlist.setColumnCount(3)
        self.projectlist.setHorizontalHeaderLabels(QtCore.QStringList(['WBS','Service','Milestone']))
        self.projectlist.setColumnWidth(0, 100)       
        self.projectlist.setColumnWidth(1, 100)
        self.projectlist.setColumnWidth(2, 150)

        gbox.addWidget(self.projectlist,5,0,3,6)

        self.getAwardBudget()

    def getAwardBudget(self):

        global wbs_details

        wbs_details = []
        wbs_details.append(["123", "Service 1"])
        wbs_details.append(["456", "Service 2"])        
        print wbs_details

        self.projectlist.setRowCount(len(wbs_details))
        for n,item in enumerate(wbs_details):            

            qitem = QtGui.QTableWidgetItem(item[0])
            self.projectlist.setItem(n, 0, qitem)
            qitem = QtGui.QTableWidgetItem(item[1])
            self.projectlist.setItem(n, 1, qitem)
            milestone_options = ["Award","Mobilization","Survey"]
            milestonecombo = QtGui.QComboBox()
            for t in milestone_options:
                milestonecombo.addItem(t)
            milestonecombo.setFixedWidth(150)
            self.projectlist.setCellWidget(n, 2, milestonecombo)


class RepoGUI(QtGui.QMainWindow):
    '''
    Main Widget for REPO helper
    '''
    def __init__(self):
        super(RepoGUI, self).__init__()
        #self.mode = mode
        self.initUI()

    def initUI(self):
        global approval, approval_names, username, approval_names
        self.tabs = QtGui.QTabWidget()
        self.setCentralWidget(self.tabs)
        self.tabs.setAutoFillBackground(1)

        fh = open('settings.json')
        settings = json.load(fh)
        fh.close()

        if settings['WCNsubmit'] == 1:
            self.tabs.addTab(WCNSelectTab(), 'WCN Creation') 

        self.setWindowTitle('Work Completion Notification')  
        self.setGeometry(300, 150, 1400, 800)
        self.setStyleSheet('font-size: %ipt' %settings['fontsize'])   

        self.show()    

def main(): 
    app = QtGui.QApplication(sys.argv)
    ex = RepoGUI()

    sys.exit(app.exec_())

if __name__ == '__main__':

    main()

1 个答案:

答案 0 :(得分:1)

可能的解决方案是使用indexAt(),因为QComboBox的位置相对于viewport(),但为了获得所选的QComboBox,我们使用sender() 1}}。

    for n,item in enumerate(wbs_details):            

        qitem = QtGui.QTableWidgetItem(item[0])
        self.projectlist.setItem(n, 0, qitem)
        qitem = QtGui.QTableWidgetItem(item[1])
        self.projectlist.setItem(n, 1, qitem)
        milestone_options = ["Award","Mobilization","Survey"]
        milestonecombo = QtGui.QComboBox()
        milestonecombo.addItems(milestone_options)
        milestonecombo.setFixedWidth(150)
        milestonecombo.currentIndexChanged[str].connect(self.onCurrentIndexChanged)
        self.projectlist.setCellWidget(n, 2, milestonecombo)

def onCurrentIndexChanged(self, text):
    combobox = self.sender()
    ix = self.projectlist.indexAt(combobox.pos())
    print(ix.row(), ix.column(), text)

另一种可能的解决方案是使用属性:

    for n,item in enumerate(wbs_details):            

        qitem = QtGui.QTableWidgetItem(item[0])
        self.projectlist.setItem(n, 0, qitem)
        qitem = QtGui.QTableWidgetItem(item[1])
        self.projectlist.setItem(n, 1, qitem)
        milestone_options = ["Award","Mobilization","Survey"]
        milestonecombo = QtGui.QComboBox()
        milestonecombo.addItems(milestone_options)
        milestonecombo.setFixedWidth(150)
        milestonecombo.setProperty("row", n)
        milestonecombo.setProperty("column", 1)
        milestonecombo.currentIndexChanged[str].connect(self.onCurrentIndexChanged)
        self.projectlist.setCellWidget(n, 2, milestonecombo)

def onCurrentIndexChanged(self, text):
    combobox = self.sender()
    r = combobox.property("row").toPyObject()
    c = combobox.property("column").toPyObject()
    print(r, c, text)