2

各行の最初の列が QComboBoxex である QTableWidget テーブルがあり、これはテーブルの QTableWidgetItems であり、残りは通常のテキスト入力セルです。

QComboboxes のいずれかから "currentIndexChanged(int)" シグナルを取得する方法を教えてください。

以下は機能しません。

def insert_row_cb(self, table, cb_col):
    rows = table.rowCount()
    table.insertRow(rows)
    self.set_row_items_cb(table, cb_col)
    self.resize_rows(table)
    return table

def set_row_items_cb(self, table, cb_col):
    cb = QtGui.QComboBox()
    signalMapper = QtCore.QSignalMapper()

    rows = table.rowCount()
    cols = table.columnCount()
    for col in range(cols):
        if col == cb_col:
            table.setCellWidget(rows - 1, cb_col, cb)
            signalMapper.setMapping(cb, table.item(0, 0))
            cb.currentIndexChanged.connect(signalMapper.map)
            signalMapper.mapped.connect(self.cb_index_changed)
        else:
            table.setItem(rows - 1, col, QtGui.QTableWidgetItem(''))
    return table

def cb_index_changed(self, index):
    print(index)

ありがとうございました。

* 編集 - わかりました!*

私のDataTableクラス:

from PyQt4 import QtGui, QtCore

class DataTable(QtCore.QObject):
cb_index_changed_signal = QtCore.pyqtSignal(QtGui.QWidget)
def __init__(self, parent = None):
    QtCore.QObject.__init__(self)

    self.signalMapper = QtCore.QSignalMapper()
    self.signalMapper.mapped[QtGui.QWidget].connect(self.on_signalMapper_mapped)

def insert_row_cb(self, table, cb_col):
    rows = table.rowCount()
    table.insertRow(rows)
    self.set_row_items_cb(table, cb_col)
    self.resize_rows(table)
    return table

def set_row_items_cb(self, table, cb_col):
    cb = QtGui.QComboBox()
    cb.currentIndexChanged.connect(self.signalMapper.map)

    rows = table.rowCount()
    cols = table.columnCount()
    for col in range(cols):
        if col == cb_col:
            table.setCellWidget(rows - 1, cb_col, cb)
            cb.row = rows - 1
            cb.column = cb_col
            self.signalMapper.setMapping(cb, cb)
        else:
            table.setItem(rows - 1, col, QtGui.QTableWidgetItem(''))
    return table

def on_signalMapper_mapped(self, cb):
    self.cb_index_changed_signal.emit(cb)

ここで別のクラスでテーブルを作成します。

from scripts.data_table import DataTable

self.data_table = DataTable(self)
self.consumption_table = self.data_table.insert_row_cb(self.consumption_table, 0)
self.data_table.cb_index_changed_signal.connect(self.cb_index_changed_signal)

def cb_index_changed_signal(self, cb):
    print ("row: "+str(cb.row)+" column: "+str(cb.column)+" text: "+cb.currentText())
4

1 に答える 1