python - 根据是否选中 QCheckbox 获取表行值

标签 python pyqt4 qtablewidget qcheckbox

我在根据是否选中 QCheckBox 来获取 QTableWidget 的值时遇到问题。

from PyQt4 import QtGui
import cx_Oracle
from PyQt4.QtGui import *
from PyQt4.QtCore import Qt
from sympy import true


class PCFFileChecker(QFrame):
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableV5.selectedItems():
            print currentQTableWidgetItem.text()


    def __init__(self, parent=None):
        super(PCFFileChecker, self).__init__(parent)

        self.Tab = QtGui.QTabWidget()
        qvboxlayout = QtGui.QGridLayout(self)

        self.TabV5 = QtGui.QWidget()
        self.TabV7 = QtGui.QWidget()

        self.tableV5 = QtGui.QTableWidget(0, 8, self.TabV5)
        self.tableV7 = QtGui.QTableWidget(0, 9, self.TabV7)

        # layout = QtGui.QVBoxLayout(self)
        self.buttonV5 = QtGui.QWidget()
        self.button1 = QtGui.QPushButton("Update Markit")
        self.button2 = QtGui.QPushButton("Clear")

        # self.TabV5.addWidget(self.button)

        self.get_markitv5_details()
        self.get_markitv7_details()

        self.Tab.addTab(self.tableV5, "Markit v5")
        self.Tab.addTab(self.tableV7, "Markit v7")

        qvboxlayout.addWidget(self.Tab)
        qvboxlayout.addWidget(self.button1)
        qvboxlayout.addWidget(self.button2)

        self.tableV5.itemSelectionChanged.connect(self.on_click)
        self.tableV7.itemSelectionChanged.connect(self.on_click)

        self.button1.clicked.connect(self.ButtonClicked)

    def ButtonClicked(self):
        checked_listV5 = []
        for i in range(self.tableV5.rowCount()):

            if self.tableV5.cellWidget(i, 0).findChild(type(QtGui.QCheckBox())).isChecked():
                checked_listV5.append(self.tableV5.item(i, 1).text())
        print checked_listV5


    def get_markitv5_details(self):
        self.tableV5.setHorizontalHeaderLabels(
            ['Tick', 'Instrument ID', 'Bloolmberg Code', 'Cluster ID', 'Insutrument Name', 'Position Date',
             'Last Update Time', 'ISIN'])

        db = cx_Oracle.connect('DBURL')
        # db = cx_Oracle.connect('DBURL')
        cur = db.cursor()
        # insturment_id, bloomberg_code, instrument_name, ,Cluster_id, posistion_date, last_update_time, ISIN
        cur.execute(
            'select p.instrumentid, vmc.bloomberg_code, i.clusterid, i.instrumentname, p.positiondate, p.lastupdated, vmc.isin_code from markit.instruments i,  markit.positions p , MARKIT.VW_MRK_COMPOSITE_INSTRUMENTS vmc where clusterid in ( select clusterid from markit.clusters where CLUSTERNAME in ( select vmci.SHORT_INSTRUMENT_NAME from MARKIT.VW_MRK_COMPOSITE_INSTRUMENTS vmci, TRD_DATA_ADM.IRE_ETF_MASTER@repl_prod aa, markit_etf_params mep where vmci.bloomberg_code = aa.ROOTBLOOMBERG and aa.ROOTBLOOMBERG = mep.INSTR_NAME)) and i.instrumentid = p.instrumentid and vmc.INSTRUMENT_ID = i.instrumentid and p.positiondate <= trunc(sysdate)')
        rows = cur.fetchall()

        # print rows
        for i, row in enumerate(rows):
            self.tableV5.insertRow(i)
            checkItem = QTableWidgetItem()
            checkItem.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            checkItem.setCheckState(Qt.Unchecked)
            checkItem.setTextAlignment(Qt.AlignVCenter)
            self.tableV5.setItem(i, 0, checkItem)
            #self.tableV5.setItem(i, 5, DateItem)
            #self.tableV5.setCellWidget(i, 0,self.Tab)
            print (i)
            for j, item in enumerate(row):
                newItem = QTableWidgetItem(str(item))
                self.tableV5.setItem(i, j + 1, newItem)
                if (j != 5):
                    newItem.setFlags(Qt.ItemIsEditable)
        header = self.tableV5.horizontalHeader()
        header.setResizeMode(QHeaderView.ResizeToContents)

        cur.close()
        print(db.version)
        db.close()

    def checkItem_changed(self, state):
        self.itemCheck = (state == Qt.Checked)

        print(self.itemCheck)


    def get_markitv7_details(self):
        self.tableV7.setHorizontalHeaderLabels(
            ['Tick', 'ISIN', 'Asset Code', 'Asset ID', 'Asset Code Type', 'Cluster ID', 'Instrument Name',
             'Last Update Time', 'Trade Date'])

        # db = cx_Oracle.connect('DBURL')
        db = cx_Oracle.connect('DBURL')
        cur = db.cursor()
        # insturment_id, bloomberg_code, instrument_name, ,Cluster_id, posistion_date, last_update_time, ISIN
        cur.execute(
            "select distinct ac.Value ISIN, vmis.asset_code, vmis.asset_code_type, a.AssetID, c.ClusterID, c.Name, c.SourceLastUpdated, cast(e.TradeDate as date) TradeDate from MARKIT7_SIG.tblCluster c join  MARKIT7_SIG.tblInstrument i on i.ClusterID = c.ClusterID join MARKIT7_SIG.tblInstrumentSmry iss on iss.IndexMark = i.InstrumentMark join MARKIT7_SIG.tblEtp e on e.ClusterID = c.ClusterID join MARKIT7_SIG.tblAsset a on a.AssetID = e.EtpAssetID join MARKIT7_SIG.VW_MRK7_COMP_INSTRUMENTS_SPRD vmis on vmis.asset_id = a.AssetID join MARKIT7_SIG.tblAssetCode ac on ac.AssetID = e.EtpAssetID and ac.CodeVendorID = (select CodeVendorID from MARKIT7_SIG.tblCodeVendor where Value = 'ISIN') and nvl(e.TradeDate, sysdate) < trunc(sysdate) and c.SourceLastUpdated < trunc(sysdate) and c.name like '%'")
        rows = cur.fetchall()

        # print rows
        for i, row in enumerate(rows):
            self.tableV7.insertRow(i)
            checkItemV7 = QTableWidgetItem()
            checkItemV7.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            checkItemV7.setCheckState(Qt.Unchecked)
            checkItemV7.setTextAlignment(Qt.AlignVCenter)
            self.tableV7.setItem(i, 0, checkItemV7)
            print (i)
            for j, item in enumerate(row):
                newItem = QTableWidgetItem(str(item))
                self.tableV7.setItem(i, j + 1, newItem)
                if (j != 6):
                    newItem.setFlags(Qt.ItemIsEditable)
        header = self.tableV7.horizontalHeader()
        header.setResizeMode(QHeaderView.ResizeToContents)
        cur.close()
        print(db.version)
        db.close()

运行我的代码时出现以下错误:

Traceback (most recent call last):
  File "C:/Users/admindholkawa/PycharmProjects/PCFChecks/pcffilechecks.py", line 54, in ButtonClicked
    if self.tableV5.cellWidget(i, 0).findChild(type(QtGui.QCheckBox())).isChecked():
AttributeError: 'NoneType' object has no attribute 'findChild'

知道我在这里遗漏了什么吗?

最佳答案

错误发生是因为您没有设置任何单元格小部件,因此 cellWidget() 将始终返回 None。然而,这是无关紧要的,因为您实际上需要查询表小部件 items 的检查状态(这是您已设置为可检查的)。

您的代码应该看起来更像这样:

    def ButtonClicked(self):
        checked_listV5 = []
        for i in range(self.tableV5.rowCount()):    
            if self.tableV5.item(i, 0).checkState() == QtCore.Qt.Checked:
                checked_listV5.append(self.tableV5.item(i, 1).text())

关于python - 根据是否选中 QCheckbox 获取表行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33738972/

相关文章:

Python 脚本回退到第二个服务器

python - Blender 是用什么创建的?

python - PyQt 崩溃和线程安全

python - QTableWidget 可以有多少行或多少列?

python - python 的尾部。最佳性能实现

python - pyqt - 将颜色与现有数据一起放入 QTableView 中

python - 如何使用 PyQt4.QtWebKit 从选项列表中选择值

python - 如何禁用 QTableWidget 中的选择突出显示

c++ - 是否可以在另一个 QTableWidget 中添加一个 QTableWidget?

python - 在保持顺序的同时找到两个 NumPy 数组的交集的最快方法是什么?