填充QLineEdits的QTableWidget不会触发信号

时间:2013-11-17 17:16:09

标签: c++ qt signals

我对QT比较陌生。在我的代码中,我创建了一个QTableWidget,遍历行并将单元格设置为QLineEdits和QCheckBoxes。我想这样做,以便更改任何QLineEdits中的文本或检查/取消选中QCheckBox会导致我的表触发传递相关项目或其所在行/列的信号。

我在这里建立了表格:

for(int row=0; row < conditionTable->rowCount(); row++)
{
    QLineEdit *condition = new QLineEdit;
    conditionTable->setCellWidget(row, 0, condition);

    QLineEdit *minBoundField = new QLineEdit;
    conditionTable->setCellWidget(row, 1, minBoundField);

    QLineEdit *maxBoundField = new QLineEdit;
    conditionTable->setCellWidget(row, 2, maxBoundField);

    QCheckBox *checkbox = new QCheckBox;
    conditionTable->setCellWidget(row, 3, checkbox);

    if(row > 0)
    {
        condition->setReadOnly(true);
        minBoundField->setReadOnly(true);
        maxBoundField->setReadOnly(true);
        checkbox->setCheckable(false);
    }
}

然后我尝试将其设置为可以通过其中一个插槽方法处理对表的更改:

connect(conditionTable, SIGNAL(itemChanged(QTableWidgetItem*)),
        this, SLOT(handleConditionTableChange(QTableWidgetItem*)));

然而,这似乎不起作用,我不知道从哪里开始。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你不应该在这里使用QLineEdit和QCheckBox。

要在QTableWidget中添加复选框,请执行以下操作:

QTableWidgetItem* item =  new QTableWidgetItem("check box");
item->setFlags(Qt::ItemIsUserCheckable);
item->setCheckState(Qt::Unchecked);
tableWidget->setItem(row, column, item);

添加行编辑:

QTableWidgetItem* item =  new QTableWidgetItem("line edit");
tableWidget->setItem(row, column, item);

使用此设置,当项目更改时将发出信号。

编辑: 例如,尝试类似:

for(int row=0; row < conditionTable->rowCount(); row++)
{
    QTableWidgetItem* condition =  new QTableWidgetItem("");
    conditionTable->setItem(row, 0, condition);

    QTableWidgetItem *minBoundField = new QTableWidgetItem("");
    conditionTable->setItem(row, 1, minBoundField);

    QTableWidgetItem *maxBoundField = new QTableWidgetItem("");
    conditionTable->setItem(row, 2, maxBoundField);

    QTableWidgetItem *checkbox = new QTableWidgetItem("");
    checkbox->setFlags(Qt::ItemIsUserCheckable);
    checkbox->setCheckState(Qt::Unchecked);
    conditionTable->setItem(row, 3, checkbox);

    if(row > 0)
    {
        condition->setFlags(Qt::NoItemFlags);
        minBoundField->setFlags(Qt::NoItemFlags);
        maxBoundField->setFlags(Qt::NoItemFlags);
        checkbox->setFlags(Qt::NoItemFlags);
    }
}

如果由于某种原因仍想使用QLineEdit和QCheckBox,则需要将每个行编辑和每个复选框连接到一个插槽。