没有发出信号,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);
为了测试它,我QListWidget
在MainWindow
类中添加了 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
MainWindow
false
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);
}
}