2016-03-03 284 views
0

我在每一行都有一個刪除按鈕。我正在嘗試使用QTableview的clicked()SIGNAL來獲取當前索引,然後做相應的操作,但在這種情況下不調用此插槽。由於某種原因它不起作用,我在連接clicked()SIGNAL時犯了一些錯誤嗎?QTableView:如何正確使用clicked()信號來獲取所選項目的索引?

void MyClass::myFunction() 
    { 
      ComboBoxItemDelegate* myDelegate; 
      myDelegate = new ComboBoxItemDelegate(); 
      model = new STableModel(1, 8, this); 
      filterSelector->tableView->setModel(model); 
      filterSelector->tableView->setItemDelegate(myDelegate); 
      connect(filterSelector->tableView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(slotHandleDeleteButton(const QModelIndex&))); 
      exec(); 
    } 

    void MyClass::slotHandleDeleteButton(const QModelIndex& index) 
    { 
     if(index.column() == 8) 
      model->removeRow(index.row()); 
    } 
+0

MyClass是否來自'SFilterEditor'? – Tomas

+0

我編輯了代碼,請審查。 – wazza

+0

我想它適用於除按鈕之外的所有列。對? – Tomas

回答

0

一種解決方案可以是這樣的:

class Button : public QPushButton 
{ 
    Q_OBJECT 
public: 
    Button(int row, QWidget *parent = 0) : QPushButton(parent), m_row(row) 
    { 
     connect(this, SIGNAL(clicked()), this, SLOT(onClicked())); 
    } 

signals: 
    void clicked(int row); 

private slots: 
    void onClicked() 
    { 
     emit clicked(m_row); 
    } 
private: 
    int m_row; 
}; 

Button類包含行號作爲參數的自定義信號clicked(int)。要在你的表格視圖中使用它,你需要這樣做:

Button *btn = new Button(rowNumber, this); 
connect(btn, SIGNAL(clicked(int)), this, SLOT(onButtonClicked(int))); 
+0

對不起,遲到的回覆,我嘗試過,但這種方法存在問題。 @vahancho由於這些刪除按鈕刪除整行,所以當第5行中的第3行被刪除時,下行(第4和第5)中刪除按鈕的索引不會更新。我的意思是第4行現在是第3行,但是爲其刪除按鈕存儲的索引將是第4行,這將導致刪除按鈕索引和行索引(rowPosition)之間的不一致。 – wazza

相關問題