【问题标题】:Accessing a the click() slot of a button generated during runtime - Qt Creator访问在运行时生成的按钮的 click() 插槽 - Qt Creator
【发布时间】:2024-01-14 17:22:01
【问题描述】:

我在 Qt Creator 中有一个用作购物清单的 GUI 项目。我正在使用 QLineEdit 将项目添加到 QTableWidget。用户输入内容,按下 QPushButton。然后,该插槽在第一列中向 QTableWidget 添加一个新行,并在第二列中添加一个新的 QPushButton。然后我希望用户能够按下按钮并清除该行,但我不知道如何访问该插槽或发件人(我不确定正确的术语。)这是到目前为止的代码. itemList 是我的 QTableWidget,itemInput 是 QLineEdit。

void MainWindow::on_btnAddItem_clicked()
{
    ui->itemList->insertRow(ui->itemList->rowCount());
    ui->itemList->setItem((ui->itemList->rowCount())-1,0,new QTableWidgetItem(ui->itemInput->text()));
    QPushButton *clear = new QPushButton("Clear",this);
    ui->itemList->setIndexWidget(ui->itemList->model()->index(ui->itemList->rowCount()-1, 1), clear);
    ui->itemInput->clear();
}

这是程序最初运行的时间。一旦他们点击按钮,它就会运行on_btnAddItem_clicked()

然后它看起来像这样,我想让清除按钮删除它所在的行。

我需要创建一个新插槽吗?有什么帮助吗?

【问题讨论】:

  • 我需要创建一个新插槽吗? 如果您没有插槽,可以。我看到您正在创建新按钮,但没有将其 clicked() 信号连接到 MainWindow 中的插槽。也不要为您创建的新插槽使用 on_ 命名约定,因为这不会是自动连接。
  • @drescherjm,据我了解,他/她正试图将clicked() 信号连接到QTableWidget(或其模型或委托?)的某个插槽,并带有相应的QTableWidgetItem作为输入参数,以便可以编辑/删除该QTableWidgetItem 的内容。信号clicked() 只能传递bool 作为参数,那么他们将如何访问要擦除的行。听起来对吗?
  • 不不,我已经拥有的 clicked() 信号将用户输入与同一行中的新按钮一起添加到表中。然后我希望用户能够按下按钮并让它清除行。这样,他们可以从表中删除条目。但是我无法预先创建行和按钮,因为我不知道用户将输入多少条目,所以如果按钮在程序运行之前不存在,我不确定如何让按钮执行某些操作。
  • 我做了一些修改,希望能更清楚。
  • @Kenta,我提到了QPushButton 的信号clicked(),它是您动态创建的,在您的屏幕截图中称为“清除”。现在有意义吗?

标签: c++ qt qt-creator signals-slots


【解决方案1】:

您需要创建自己的按钮类并继承 QPushButton。像这样:

class MyButton : public QPushButton {
    public:
    MyButton();
    QTableWidgetItem *titem;
}

这里是主窗口:

void MainWindow::on_btnAddItem_clicked()
{
    ui->itemList->insertRow(ui->itemList->rowCount());
    ui->itemList->setItem((ui->itemList->rowCount())-1,0,new QTableWidgetItem(ui->itemInput->text()));
    MyButton *clear = new MyButton("Clear",this);
    clear->titem = ui->itemList->item(ui->itemList->rowCount()-1, 0);
    connect(clear, SIGNAL(clicked()), SLOT(on_btnClear_Clicked()));
    ui->itemList->setIndexWidget(ui->itemList->model()->index(ui->itemList->rowCount()-1, 1), clear);
    ui->itemInput->clear();
}

void MainWindow::on_btnClear_Clicked()
{
    MyButton *btn = (MyButton*)QObject::sender();
    ui->itemList->removeRow(btn->titem->row());
}

请注意,这只是一步。

【讨论】:

  • 改用qobject_cast<MyButton *>(QObject::sender())会更好。