具有自定义小部件的QListWidget-不触发itemClicked信号

时间:2018-07-18 21:05:39

标签: c++ qt signals-slots qlistwidget qlistwidgetitem

我有一个listwidgetitem,它具有一个自定义窗口小部件(step_widget),其中包含3个QPushButton和一个QLabel。 当我按下小部件中的按钮之一时,它不会触发itemClicked,而我需要查看被单击的listwidget的索引。如果我单击QLabel,则会触发信号,并且能够获取索引。按下其中一个按钮时如何触发信号?为什么不触发?

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

2 个答案:

答案 0 :(得分:0)

由于itemClicked()使用了click事件,因此未发出QPushButton信号。
我找到了最简单的解决方案。
首先,在您的班级stepWidget中添加一个信号,单击任何QPushButton时将发出该信号,例如:

signals:
    void widgetClicked();

然后将每个clicked()的{​​{1}}信号与此信号相连。这段代码在小部件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); 类中的QListWidget添加了10个小部件。您必须将该信号连接到插槽(在这种情况下,我使用C ++ 11 Lambda函数,但是可以创建插槽,没关系),在此处将当前项建立为小部件下的项。这段代码位于MainWindow的构造函数中:

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类的属性,该属性在以下连接期间始终为MainWindow

false

然后,您必须操纵来自connect(ste_pWidget, &stepWidget ::widgetClicked, [=]() { buttonPressed = true; ui->listWidget->setCurrentItem(item); buttonPressed = false; }); 的两个信号:QListWidgetclicked()。我选择currentRowChanged()代替clicked(),因为它几乎可以直接访问该行:

itemClicked()

答案 1 :(得分:0)

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