如果我点击 QTableWidget 的 child,如何获取当前行?
How to get current row of QTableWidget if I clicked on its child?
我创建了一个 QTableWidget
,我在其中使用了 setCellWidget(QWidget*)
。我在单元格小部件中设置了 QLineEdit
。我还创建了一个删除按钮,单击该按钮会向函数 deleteRow
发送一个信号。我还使用函数 currentRow()
来获取当前行,但由于 QLineEdit
,它 returns -1
。代码片段如下。
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
,然后单击删除按钮。请帮我解决一下。
刚刚在这里试了一下,似乎是 table 的 currentRow
returns -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();
}
}
如果行可能在程序运行时被删除,那么接受的解决方案将无法正常工作。因此,该方法需要更新所有属性。可以做,如果这是一个很少见的操作。
我采用了迭代方法:
for(unsigned int i = 0; i < table->rowCount(); ++i)
{
if(table->cellWidget(i, relevantColumn) == QObject::sender())
{
return i;
}
}
return -1;
快速,肮脏,但有效,并且在我的情况下更合适,因为行经常被删除或改变它们的位置,只有小部件中的按钮连接到插槽并且从未直接调用插槽。如果不满足这些条件,可能需要进一步检查
(if(QObject::sender()) { /* */ }
, ...).
只有在每次删除行时重新计算 QLineEdit 的 属性 时,Karsten 的答案才能正常工作,这可能需要大量工作。只有通过 signal/slot 机制调用该方法,阿空加瓜的答案才有效。在我的解决方案中,我只计算了具有焦点的 QlineEdit 的位置(假设所有 table 项都使用 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;
}
我创建了一个 QTableWidget
,我在其中使用了 setCellWidget(QWidget*)
。我在单元格小部件中设置了 QLineEdit
。我还创建了一个删除按钮,单击该按钮会向函数 deleteRow
发送一个信号。我还使用函数 currentRow()
来获取当前行,但由于 QLineEdit
,它 returns -1
。代码片段如下。
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
,然后单击删除按钮。请帮我解决一下。
刚刚在这里试了一下,似乎是 table 的 currentRow
returns -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();
}
}
如果行可能在程序运行时被删除,那么接受的解决方案将无法正常工作。因此,该方法需要更新所有属性。可以做,如果这是一个很少见的操作。
我采用了迭代方法:
for(unsigned int i = 0; i < table->rowCount(); ++i)
{
if(table->cellWidget(i, relevantColumn) == QObject::sender())
{
return i;
}
}
return -1;
快速,肮脏,但有效,并且在我的情况下更合适,因为行经常被删除或改变它们的位置,只有小部件中的按钮连接到插槽并且从未直接调用插槽。如果不满足这些条件,可能需要进一步检查
(if(QObject::sender()) { /* */ }
, ...).
只有在每次删除行时重新计算 QLineEdit 的 属性 时,Karsten 的答案才能正常工作,这可能需要大量工作。只有通过 signal/slot 机制调用该方法,阿空加瓜的答案才有效。在我的解决方案中,我只计算了具有焦点的 QlineEdit 的位置(假设所有 table 项都使用 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;
}