如果点击它的孩子,如何获取QTableWidget的当前行?

时间:2016-05-30 10:13:26

标签: c++ qt qtablewidget

我创建了一个QTableWidget,其中我使用了setCellWidget(QWidget*)。我在单元格小部件中设置了QLineEdit。我还创建了一个删除按钮,然后单击该按钮会向函数deleteRow发送信号。我还使用函数currentRow()来获取当前行,但由于-1,它返回QLineEdit。代码段如下所示。

void createTable() {
    m_table = new QTableWidget(QDialog); //member variable
    for (int i = 0; i < 3; i++)
    {
        QLineEdit *lineEdit = new QLineEdit(m_table);
        m_table->setCellWidget(i, 0, lineEdit);
    }
    QPushButton *deleteBut = new QPushButton(QDiaolg);
    connect(deleteBut, SIGNAL(clicked()), QDialog, SLOT(editRow()));
}

editRow() {
    int row = m_table->currentRow(); // This gives -1
    m_table->remove(row);
}

在上面的场景中,我单击QLineEdit,然后单击按钮删除。请帮我解决一下。

3 个答案:

答案 0 :(得分:2)

在这里尝试过,似乎在程序启动后立即单击按钮时,表的currentRow返回-1,首次选择单元格,然后选择QLineEdit然后单击按钮,正确行返回。

我会执行以下操作作为解决方法:在QLineEdit中保存行号,例如使用QObject::setProperty

 QLineEdit *lineEdit = new QLineEdit(m_table);
 lineEdit->setProperty("row", i);
 m_table->setCellWidget(i, 0, lineEdit);

然后,在editRow处理程序中,通过向QTableWidget询问其焦点子项来检索属性:

int row = m_table->currentRow();
if (row == -1) {
  if (QWidget* focused = m_table->focusWidget()) {
    row = focused->property("row").toInt();
  }
}

答案 1 :(得分:0)

如果在程序运行时可能删除行,则接受的解决方案将无效。因此,该方法需要更新所有属性。可以这样做,如果这是一种罕见的操作。

我逃避了迭代方法:

for(unsigned int i = 0; i < table->rowCount(); ++i)
{
    if(table->cellWidget(i, relevantColumn) == QObject::sender())
    {
        return i;
    }
}
return -1;

快速,脏,但工作,在我的情况下更合适,因为行经常被删除或改变他们的位置,只有小部件中的按钮连接到插槽,并且从不直接调用插槽。如果不满足这些条件,可能需要进一步检查(if(QObject::sender()) { /* */ },...)。

答案 2 :(得分:0)

只有在每次删除行时重新计算QLineEdit的属性时,Karsten的答案才能正常工作,这可能需要大量工作。只有在通过信号/槽机制调用方法时,Aconcagua的答案才有效。在我的解决方案中,我只计算具有焦点的QlineEdit的位置(假设所有表项都使用setCellWidget设置):

int getCurrentRow() {

  for (int i=0; i<myTable->rowCount(); i++)
    for (int j=0; j<myTable->columnCount(); j++) {
        if (myTable->cellWidget(i,j) == myTable->focusWidget()) {
             return i;
        }
    }

  return -1;
}