2017-10-09 118 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