2016-05-30 6 views
2

setCellWidget(QWidget*)を使用したQTableWidgetを作成しました。私はQLineEditをセルウィジェットに設定しました。また、削除ボタンも作成しました。そのボタンをクリックすると、関数deleteRowに信号が送信されます。また、関数currentRow()を使用して現在の行を取得しましたが、QLineEditのために-1を返します。コードスニペットは次のとおりです。私はQLineEditをクリックし、[削除]ボタンをクリックして上記のシナリオでQTableWidgetの現在の行を取得する方法は、その子をクリックした場合ですか?

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

。ソリューションで私を助けてください。

+0

を:QObject::setPropertyを使用することにより:

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

を次に、editRowハンドラでは、その集中子供のためQTableWidgetを尋ねることによってプロパティを取得行の編集の行が0になる'm_table-> remove(0);'を直接呼び出すことはできますか? – vahancho

+0

複数の行を追加するとどうなりますか?その場合、私は行番号を知っていなければなりません。 – njporwal

+0

私は理解のためにコードを編集しました – njporwal

答えて

2

プログラムの開始直後にボタンをクリックするとテーブルのcurrentRowが-1を返し、最初にセルを選択してからQLineEditを選択してボタンをクリックすると正しい行が返されたようです。

回避策として、次のようにします。行番号をQLineEditに保存します。あなたが明示的に設定した場合は、 `` currentRowの()を使うのはなぜ

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

'QLineEdit'は' row'という名前のプロパティを持っていますか? – vahancho

+0

いいえ、設定すると作成されます。これはドキュメント内の「動的プロパティ」と呼ばれています。 –

+0

あなたの答えはKarstenにありがとうございます。それはうまくいった。 – njporwal

関連する問題