我有一个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);
答案 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;
});
的两个信号:QListWidget
和clicked()
。我选择currentRowChanged()
代替clicked()
,因为它几乎可以直接访问该行:
itemClicked()
答案 1 :(得分:0)
您可以简单地做的是,将qpushbutton设置为qlabel,然后qpushbutton将变为可单击状态。 然后,您可以重写此方法:-on_listWidget_itemClicked(QListWidgetItem * item)双击qpushbutton。 我试过了,效果很好,很简单。