Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我点击了QTableWidget的子项,如何获取它的当前行?_C++_Qt_Qtablewidget - Fatal编程技术网

C++ 如果我点击了QTableWidget的子项,如何获取它的当前行?

C++ 如果我点击了QTableWidget的子项,如何获取它的当前行?,c++,qt,qtablewidget,C++,Qt,Qtablewidget,我创建了一个QTableWidget,其中我使用了setCellWidget(QWidget*)。我已经在cell小部件中设置了QLineEdit。我还创建了一个删除按钮,单击该按钮会向函数deleteRow发送一个信号。我还使用了一个函数currentRow()来获取当前行,但是由于QLineEdit,它返回-1。下面是代码片段 void createTable() { m_table = new QTableWidget(QDialog); //member variable

我创建了一个
QTableWidget
,其中我使用了
setCellWidget(QWidget*)
。我已经在cell小部件中设置了
QLineEdit
。我还创建了一个删除按钮,单击该按钮会向函数
deleteRow
发送一个信号。我还使用了一个函数
currentRow()
来获取当前行,但是由于
QLineEdit
,它返回
-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);
}
void createTable(){
m_table=newqtablewidget(QDialog);//成员变量
对于(int i=0;i<3;i++)
{
QLineEdit*lineEdit=新的QLineEdit(m_表);
m_table->setCellWidget(i,0,lineEdit);
}
QPushButton*deleteBut=新的QPushButton(QDiaolg);
连接(deleteBut、信号(clicked())、QDialog、插槽(editRow());
}
编辑行(){
int row=m_table->currentRow();//这给出了-1
m_表->删除(行);
}

在上述场景中,我单击
QLineEdit
,然后单击删除按钮。请帮我找到一个解决方案。

刚刚在这里尝试过,当程序启动后单击按钮时,表的
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();
  }
}

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

我采用了迭代方法:

for(unsigned int i = 0; i < table->rowCount(); ++i)
{
    if(table->cellWidget(i, relevantColumn) == QObject::sender())
    {
        return i;
    }
}
return -1;
for(无符号整数i=0;irowCount();++i)
{
如果(表->cellWidget(i,relevantColumn)=QObject::sender())
{
返回i;
}
}
返回-1;

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

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

int getCurrentRow(){
对于(int i=0;irowCount();i++)
对于(int j=0;jcolumnCount();j++){
如果(myTable->cellWidget(i,j)=myTable->focusWidget()){
返回i;
}
}
返回-1;
}

如果显式地将行编辑的行设置为0,为什么要使用
currentRow()
?可以调用
m_table->remove(0)直接,否?如果我添加多行怎么办。在这种情况下,我必须知道行号。为了更好地理解,我已经编辑了代码。知道了。但是,当您单击按钮时,应该删除哪一行?最后一个?选择/单击QLineEdit的行Does
QLineEdit
有一个名为
row
的属性?否,它是在设置时创建的。它在文档中被称为“动态属性”。有人可以在PyQt5中共享此实现吗?直到您理解,在以随机顺序删除多行之后,出现了问题:)哦,好的,我理解。我想我有一个更好的方法,即没有迭代。
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;
}