Qt表部件,删除行按钮
我有一个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);
}
如何以功能知道哪个按钮(在哪个行)被按下的方式将我的按钮连接到函数?
要删除的行,我们必须先得到该行,如果我们插入部件在细胞内的currentRow()
方法将不会返回相应的行,在许多情况下,它将返回最后一个没有选择小部件的单元格的行。
因此,您必须选择另一种解决方案,对于这种情况,我们将使用QTableWidget
的indexAt()
方法,但为此我们需要知道单元像素的位置。当一个小部件添加到单元格中时,这个单元格将成为小部件的父部件,因此我们可以使用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);
}
}
创建一个自定义类,在其中传递创建的按钮对象和行索引。从您的自定义按钮类中,处理按钮按下事件,并发出自定义信号(它将带有索引号),该定制信号从创建自定义按钮的对象处理。一些相关的代码都低于,给你一个提示:
.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);}
不幸的是,你使用的是旧插槽/信号语法,问题在于他如何获得该行,因为他使用'currentRow()'的方法不起作用。 – user3606329
是的,'currentRow()'方法将不起作用,我不明白你对旧插槽/信号的看法......你是什么意思? 'deleteRow(index)'需要从创建对象中获取,他知道要删除哪一行。 –
你的语法是好的,但它是旧方法,不支持许多新功能,比如lamba等。https://wiki.qt.io/New_Signal_Slot_Syntax – user3606329
使用这种连接方式的信号连接到插槽:
connect(ui->btnDelete, &QPushButton::clicked, this,&MainWindow::deleteRow);
和删除例如在通话功能中的一行:
void MainWindow::deleteRow()
{
int row = ui->tableWidget->currentRow();
ui->tableWidget->removeRow(row);
}
这也可以写成connect(d,&QPushButton :: clicked,[=](){ui-> tableWidget-> removeRow(ui-> tableWidget-> currentRow()););'他的解决方案是使用' currentRow()',但它不返回当前行。无论是因为插入的小部件还是因点击按钮而失去焦点。 – user3606329
传递行号作为发出信号时的参数,并且在槽中删除接收到的行号。 –
如果您没有对此信号/插槽进行排队,您可能会遇到问题,因为您在删除行**和按钮**的同时仍处理此按钮上的“单击”信号。 – ymoreau
@ user7431005尝试此连接:'connect(d,&QPushButton :: clicked,this,&MainWindow :: deleteThisLine);' – aghilpro