带有自定义小部件的 QListWidget - 不触发项目点击信号
QListWidget with custom widgets - not triggering itemClicked signal
我有一个listwidgetitem,它有一个自定义小部件(step_widget),其中包含3个QPushButtons和一个QLabel。 当我按下小部件中的一个按钮时,它不会触发itemClicked,我需要查看单击的列表小部件的索引。如果我点击QLabel,信号被触发,我能够获得索引。按下其中一个按钮时如何触发信号?为什么不触发?
QListWidgetItem *item = new QListWidgetItem();
stepWidget *step_widget = new stepWidget();
ui->listWidget->addItem(item);
ui->listWidget->setItemWidget(item,step_widget);
不会发出itemClicked()
信号,因为QPushButton
消耗单击事件。
我找到了最简单的解决方案。
首先,在您的类中stepWidget
添加一个在单击任何QPushButton
时将发出的信号,例如:
signals:
void widgetClicked();
然后将每个QPushButton
的clicked()
信号与该信号连接起来。此代码位于小部件的构造函数中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);
为了测试它,我在MainWindow
类中的QListWidget
中添加了 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()
,因为它将使用此代码发出,并且它的优点是它允许您直接获取行。显然,一旦你有了行,你就可以获得项目和小部件。
但是,此过程有一个不方便,即即使用户使用键盘选择一行或当用户在QListWidget
上按下并滑动鼠标而不释放它时,也会发出currentRowChanged()
信号。
例如,解决方法可能是使用标志作为始终false
的MainWindow
类的属性,除非在此连接期间:
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);
}
}
你可以简单地做的是,让你的qPushbutton到qlabel,然后qPushButton将变得可点击。 然后,您可以覆盖此方法:- on_listWidget_itemClicked(QListWidgetItem *item)以双击qpushbutton。 我试过了,它工作得很好,它非常简单的解决方法。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- Qt VTK交互风格的信号到小部件
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- QTreeView模型的Qt-itemChanged信号仅适用于一级项目
- QAbstractItemModel:为什么在模型中插入大量项目时发出dataChanged和insert行信号如此缓慢
- 区分Qt itemChange信号的项目时,移动和编辑