2016-05-30 1 views
2

J'ai créé un QTableWidget dans lequel j'ai utilisé setCellWidget(QWidget*). J'ai mis QLineEdit dans le widget de la cellule. J'ai également créé un bouton de suppression et en cliquant sur ce bouton envoie un signal à la fonction deleteRow. J'ai également utilisé une fonction currentRow() pour obtenir la ligne en cours, mais elle renvoie -1 en raison du QLineEdit. L'extrait de code est ci-dessous.Comment obtenir la ligne actuelle de QTableWidget si j'ai cliqué sur son enfant?

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

Dans le scénario ci-dessus je clique dans le QLineEdit puis cliquez sur le bouton Supprimer. S'il vous plaît aidez-moi avec une solution.

+0

Pourquoi utilisez-vous 'currentRow()' si vous définissez explicitement la ligne d'édition de ligne à 0? Vous pouvez appeler 'm_table-> remove (0);' directement, non? – vahancho

+0

Que faire si j'ajoute plusieurs lignes. Dans ce cas, je dois connaître le numéro de ligne. – njporwal

+0

J'ai édité le code pour mieux comprendre – njporwal

Répondre

2

Juste essayé ici, il semble que currentRow de la table renvoie -1 en cliquant sur le bouton juste après le début du programme, et lors de la sélection d'une cellule, puis en sélectionnant le QLineEdit puis en cliquant sur le bouton, la ligne correcte est retournée .

Je voudrais faire ce qui suit comme une solution de contournement: Enregistrez le numéro de ligne dans le QLineEdit, par exemple. en utilisant QObject::setProperty:

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

Ensuite, dans le gestionnaire editRow, récupérer la propriété en demandant au QTableWidget pour son enfant ciblé:

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

Est-ce que 'QLineEdit' a une propriété nommée' row'? – vahancho

+0

Non, il est créé lorsqu'il est défini. C'est ce qu'on appelle la "propriété dynamique" dans les docs. –

+0

Merci Karsten pour votre réponse. Cela a fonctionné. – njporwal