Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QTableWidget中显示单击QPushButton的行_C++_Qt_Qt5_Qtablewidget_Qtablewidgetitem - Fatal编程技术网

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);
     }