2017-10-09 117 views
1

我有一個QTableWidget和所有的行我設置一個setCellWidget在一列的按鈕。Qt表部件,刪除行按鈕

我想將此按鈕連接到刪除此行的函數。 我試過這段代碼,它不起作用,因爲如果我只是單擊我的按鈕,我不會將當前行設置爲按鈕的行。

ui->tableWidget->insertRow(ui->tableWidget->rowCount()); 
QPushButton *b = new QPushButton("delete",this); 
ui->tableWidget->setCellWidget(ui->tableWidget->rowCount()-1,0,b); 
connect(d,SIGNAL(clicked(bool)),this,SLOT(deleteThisLine())); 
... 


void MainWindow::deleteThisLine() 
{ 
    int row = ui->tableWidget->currentRow(); 
    ui->tableWidget->removeRow(row); 
} 

如何以功能知道哪個按鈕(在哪個行)被按下的方式將我的按鈕連接到函數?

+0

傳遞行號作爲發出信號時的參數,並且在槽中刪除接收到的行號。 –

+1

如果您沒有對此信號/插槽進行排隊,您可能會遇到問題,因爲您在刪除行**和按鈕**的同時仍處理此按鈕上的「單擊」信號。 – ymoreau

+0

@ user7431005嘗試此連接:'connect(d,&QPushButton :: clicked,this,&MainWindow :: deleteThisLine);' – aghilpro

回答

2

要刪除的行,我們必須先得到該行,如果我們插入部件在細胞內的currentRow()方法將不會返回相應的行,在許多情況下,它將返回最後一個沒有選擇小部件的單元格的行。

因此,您必須選擇另一種解決方案,對於這種情況,我們將使用QTableWidgetindexAt()方法,但爲此我們需要知道單元像素的位置。當一個小部件添加到單元格中時,這個單元格將成爲小部件的父部件,因此我們可以使用parent()方法從按鈕訪問單元格,然後獲取單元格相對於QTableWidget的位置並使用它在indexAt()。要訪問按鈕,我們將使用sender()

噹噹前單元格被刪除焦點丟失,一個可能的解決方案是將焦點再次放置在另一個單元格中。

void MainWindow::deleteThisLine() 
{ 
    //sender(): QPushButton 
    QWidget *w = qobject_cast<QWidget *>(sender()->parent()); 
    if(w){ 
     int row = ui->tableWidget->indexAt(w->pos()).row(); 
     ui->tableWidget->removeRow(row); 
     ui->tableWidget->setCurrentCell(0, 0); 
    } 
} 
0

創建一個自定義類,在其中傳遞創建的按鈕對象和行索引。從您的自定義按鈕類中,處理按鈕按下事件,併發出自定義信號(它將帶有索引號),該定製信號從創建自定義按鈕的對象處理。一些相關的代碼都低於,給你一個提示:

.H

class mypushbutton { 
    explicit mypushbutton(QObject *parent = 0, QPushButton *pushbutton = 0, int index = 0); 
    signal: 
     void deleteRow(int index); 
} 

的.cpp

mypushbutton() { 
connect(pushbutton, SIGNAL(clicked(bool)), this, SLOT(actionButtonClick(bool))); 
} 
actionbuttonclicked() { emit deleteRow(index);} 
+0

不幸的是,你使用的是舊插槽/信號語法,問題在於他如何獲得該行,因爲他使用'currentRow()'的方法不起作用。 – user3606329

+0

是的,'currentRow()'方法將不起作用,我不明白你對舊插槽/信號的看法......你是什麼意思? 'deleteRow(index)'需要從創建對象中獲取,他知道要刪除哪一行。 –

+0

你的語法是好的,但它是舊方法,不支持許多新功能,比如lamba等。https://wiki.qt.io/New_Signal_Slot_Syntax – user3606329

0

使用這種連接方式的信號連接到插槽:

connect(ui->btnDelete, &QPushButton::clicked, this,&MainWindow::deleteRow); 

和刪除例如在通話功能中的一行:

void MainWindow::deleteRow() 
{ 
    int row = ui->tableWidget->currentRow(); 
    ui->tableWidget->removeRow(row); 
} 
+0

這也可以寫成connect(d,&QPushButton :: clicked,[=](){ui-> tableWidget-> removeRow(ui-> tableWidget-> currentRow()););'他的解決方案是使用' currentRow()',但它不返回當前行。無論是因爲插入的小部件還是因點擊按鈕而失去焦點。 – user3606329