QTableWidget filled with QLineEdits does not fire signals

别等时光非礼了梦想. 提交于 2019-12-11 20:15:26

问题


I'm relatively new to QT. In my code, I create a QTableWidget, iterate through the rows and set the cells to QLineEdits and QCheckBoxes. I want to make it so that changing the text within any of the QLineEdits or checking/unchecking the QCheckBoxes causes my table to fire a signal passing either the item in question, or the row/column that it's within.

I build the table here:

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);
    }
}

I then try to make it so that changes to the table can be handled by one of the slot methods:

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

However, this doesn't seem to work, and I'm not sure where to go from here. Any help would be appreciated.


回答1:


You shouldn't be using QLineEdit and QCheckBox here.

To add a check box to your QTableWidget do the following:

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

To add an line edit:

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

With this setup, the signal will be emitted when an item is changed.

Edit: For your example, try something like:

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);
    }
}

If you still want to use QLineEdit and QCheckBox for some reason, you will need to connect each line edit and each check box to a slot.



来源:https://stackoverflow.com/questions/20033691/qtablewidget-filled-with-qlineedits-does-not-fire-signals

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!