C++ 如何在QTableWidget中显示单击QPushButton的行
我想删除点击了C++ 如何在QTableWidget中显示单击QPushButton的行,c++,qt,qt5,qtablewidget,qtablewidgetitem,C++,Qt,Qt5,Qtablewidget,Qtablewidgetitem,我想删除点击了QPushButton的那一行,我认为使用插槽是合理的,但怎么做我不知道,如果你有任何想法如何获得一行选中的按钮,请分享,谢谢 这是我的桌子 这是一段代码,我在其中向QTableWidget添加行 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); for(int i = 0; i&
QPushButton
的那一行,我认为使用插槽是合理的,但怎么做我不知道,如果你有任何想法如何获得一行选中的按钮,请分享,谢谢
这是我的桌子
这是一段代码,我在其中向QTableWidget添加行
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i = 0; i<20;i++)
ui->tableWidget->insertRow(ui->tableWidget->rowCount());
QVector<QString>vec;
vec<<"first"<<"sec"<<"third"<<"for"<<"fif"<<"first"<<"sec"
<<"third"<<"for"<<"fif";
vec<<"first"<<"sec"<<"third"<<"for"<<"fif"<<"first"<<"sec"
<<"third"<<"for"<<"fif";
for(int i = 0; i<ui->tableWidget->rowCount();i++)
{
for(int j = 0; j<ui->tableWidget->columnCount();j++)
{
if(j == 0)
{
QWidget* pWidget = new QWidget();
QPushButton* btn_edit = new QPushButton();
btn_edit->setText("Remove");
QHBoxLayout* pLayout = new QHBoxLayout(pWidget);
pLayout->addWidget(btn_edit);
pLayout->setAlignment(Qt::AlignCenter);
pLayout->setContentsMargins(0, 0, 0, 0);
pWidget->setLayout(pLayout);
ui->tableWidget->setCellWidget(i, j, pWidget);
continue;
}
QTableWidgetItem*item = new QTableWidgetItem(vec[i]);
item->setFlags(item->flags() ^ Qt::ItemIsEditable);
ui->tableWidget->setItem(i, j, item);
}
}
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
对于(inti=0;itableWidget->insertRow(ui->tableWidget->rowCount());
QVectorvec;
vec此任务可以使用该方法解决,但在我们必须获取行之前。首先,我们将所有按钮连接到循环内的插槽,如下所示:
*.h
private slots:
void onClicked();
*.cpp
[...]
QPushButton* btn_edit = new QPushButton();
btn_edit->setText("Remove");
connect(btn_edit, &QPushButton::clicked, this, &MainWindow::onClicked);
[...]
在插槽中,我们可以获得通过该方法发出信号的按钮,然后获得QWidget
parent(使用名称pWidget创建),这是添加到QTableWidget
的小部件,它的位置是相对于它的,然后我们使用该方法获得与单元格关联的QModelIndex
,并且通过该方法具有行的信息。以上所有操作都在以下行中实现:
void MainWindow::onClicked()
{
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);
}
}
void主窗口::onClicked()
{
QWidget*w=qobject_cast(发送方()->父方());
如果(w){
int row=ui->tableWidget->indexAt(w->pos()).row();
ui->tableWidget->removeRow(行);
ui->tableWidget->setCurrentCell(0,0);
}
}
注意:该方法用于设置焦点,因为上次删除焦点的单元格已被删除
完整的示例可以在下面找到。当您创建QPushButton时,只需添加:
btn_delete = new QPushButton("Remove", ui->tableWidget);
btn_delete->setObjectName(QString("%1").arg(ui->tableWidget->rowCount()));
connect(btn_delete, SIGNAL(clicked()), this, SLOT(CellButtonDeleteClicked()));
并创建函数CellButtonDeleteClicked()
void cellbuttonedeleteclicked()
{
//通过这条线我可以找到信号的发送者
QPushButton*pb=qobject_cast(qobject::sender());
int row=pb->objectName().toInt();
ui->tableWidget->removeRow(行);
}
void CellButtonDeleteClicked()
{
// by this line I can get the sender of signal
QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());
int row = pb->objectName().toInt();
ui->tableWidget->removeRow(row);
}