0

我有一个包含 3 个 QPushButtons 和一个 QLabel 的自定义小部件 (step_widget) 的 listwidgetitem。当我按下小部件中的一个按钮时,它不会触发 itemClicked,我需要查看被点击的列表小部件的索引。如果我点击 QLabel,信号被触发,我可以获得索引。按下其中一个按钮时如何触发信号?为什么不触发?

QListWidgetItem *item = new QListWidgetItem();
stepWidget *step_widget = new stepWidget();
ui->listWidget->addItem(item);
ui->listWidget->setItemWidget(item,step_widget);
4

2 回答 2

1

没有发出信号,itemClicked()因为QPushButton消耗了点击事件。
我找到了最简单的解决方案。
首先,在您的类中stepWidget添加一个信号,当单击任何一个时将发出该信号,QPushButton例如:

signals:
    void widgetClicked();

然后将clicked()每个信号QPushButton与该信号连接起来。此代码在小部件的构造函数中stepWidget

connect(ui->pushButton1, &QPushButton::clicked, this, &stepWidget::widgetClicked);
connect(ui->pushButton2, &QPushButton::clicked, this, &stepWidget::widgetClicked);
connect(ui->pushButton3, &QPushButton::clicked, this, &stepWidget::widgetClicked);

为了测试它,我QListWidgetMainWindow类中添加了 10 个小部件。您必须将该信号连接到一个插槽(在本例中,我使用 C++11 Lambda 函数,但您可以创建一个插槽,这很好),您可以在其中将当前项目建立为小部件下的项目。此代码位于以下构造函数中MainWindow

for (int i = 0; i < 10; ++i) {
    QListWidgetItem *item = new QListWidgetItem;
    stepWidget *step_Widget = new stepWidget;
    ui->listWidget->addItem(item);
    ui->listWidget->setItemWidget(item, step_Widget);
    connect(step_Widget, &stepWidget::widgetClicked, [=]() {
        ui->listWidget->setCurrentItem(item);
    });
}

现在,这不会发出itemClicked()信号,因为用户没有单击该项目。但我建议您改为连接信号currentRowChanged(),因为它将与此代码一起发出,并且它还具有允许您直接获取行的优点。显然,一旦您拥有该行,您就可以获得项目和小部件。
但是,此过程的不便之处在于,即使用户使用键盘选择了一行,或者当用户按下并在鼠标上滑动而不释放它currentRowChanged()时,也会发出信号。 例如,解决方法可能是使用一个标志作为您的类的属性,该属性始终在此连接期间除外: QListWidget
MainWindowfalse

connect(ste_pWidget, &stepWidget ::widgetClicked, [=]() {
    buttonPressed = true;
    ui->listWidget->setCurrentItem(item);
    buttonPressed = false;
});

然后你必须操纵来自QListWidget:clicked()和的两个信号currentRowChanged()。我选择clicked()而不是itemClicked()因为它几乎可以直接访问该行:

void MainWindow::on_listWidget_clicked(const QModelIndex &index)
{
    ui->statusBar->showMessage(tr("Row clicked: %1").arg(index.row()), 1000);
}

void MainWindow::on_listWidget_currentRowChanged(int currentRow)
{
    if (buttonPressed) {
        ui->statusBar->showMessage(tr("Row clicked: %1").arg(currentRow), 1000);
    }
}
于 2018-07-19T03:45:11.133 回答
0

您可以简单地做的是,将您的 qpushbutton 设置为 qlabel,然后 qpushbutton 将变为可点击。然后您可以覆盖此方法:- on_listWidget_itemClicked(QListWidgetItem *item) 双击 qpushbutton。我试过了,效果很好,很简单的解决方法。

于 2020-09-02T13:38:58.247 回答