c++ - QTableView 没有检测到 doubleClick
问题描述
我有一个QTableView
,当我双击时,我想打开一个QInputDialog
.
roslaserscandialog.h
private slots:
void on_tableView_doubleClicked(const QModelIndex &index);
roslaserscandialog.cpp
ROSLaserScanDialog::ROSLaserScanDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ROSLaserScanDialog)
{
ui->setupUi(this);
connect(ui->tableView,SIGNAL( doubleClicked(const QModelIndex&)), this, SLOT ( on_tableView_doubleClicked(const QModelIndex &index)));
}
void ROSLaserScanDialog::on_tableView_doubleClicked(const QModelIndex &index)
{
QString rosMsg = QInputDialog::getText(this, "ROS Msg Name", "Enter Msg");
Q_UNUSED(index)
}
我尝试了许多不同的方法来QTableView
检测我的双击,但到目前为止我尝试的方法并不成功:
1)这是我尝试过的试验之一,它应该可以工作,因为我也遵循了官方文档:
QObject::connect(ui->tableView, SIGNAL(doubleClicked()), this, SLOT(on_tableView_doubleClicked()));
2)我也尝试通过以下方式打开它:
QObject::connect(ui->tableView, QOverload<int>::of(&QTableView::doubleClicked),
[=](int index) { on_tableView_doubleClicked(const QModelIndex &index); });
我从调试器收到的错误如下,但我不明白这是怎么发生的:
QObject::connect: No such signal QTableView::doubleClicked() in /home/emanuele/Desktop/ultrasound_mapper/src/ERDatabaseSystem/ui/roslaserscandialog.cpp:128
QObject::connect: (sender name: 'tableView')
QObject::connect: (receiver name: 'ROSLaserScanDialog')
编辑 2:可验证的示例,其.ui
表单仅带有QTableView
. QTableView
简称ui->tableView
:_
主文件
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
对话框.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_tableView_doubleClicked(const QModelIndex &index);
//void onTableViewDoubleClicked(const QModelIndex &index);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
对话框.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QInputDialog>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(ui->tableView, SIGNAL(doubleClicked), this,
SLOT(on_tableView_doubleClicked(const QModelIndex &index)));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_tableView_doubleClicked(const QModelIndex &index)
{
QString ros = QInputDialog::getText(this, "Dialog", "Enter text");
}
对话框.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>356</width>
<height>292</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTableView" name="tableView"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
此外,在这个EDIT 2中,我还尝试了同样不起作用的匿名路由:
connect(ui->tableView, &QTableView::doubleClicked, [&]() {
QString rosMsg = QInputDialog::getText(this, "ROS Msg Name", "Enter Msg");
});
以下也不起作用:
QObject::connect(ui->tableView, &QTableView::doubleClicked(const QModelIndex &index),
[=](int index) { onTableViewDoubleClicked(index); });
我研究并发现了这个来源,另一个有用的来源,正如评论所暗示的那样,这个例子工作正常。但对我的不起作用。
另一篇文章建议使用这个官方来源,特别是使用QAbstractItemView::doubleClicked。但是,对于这个简单的示例,我认为我不必走那条路,也不需要使视图复杂化。
这篇文章以我试图解决我的问题的确切方式解决了这个问题,但我不明白为什么我的QTableView
.
请指出如何更好地解决此问题的正确方向。
解决方案
推荐阅读
- string - std::string 列表初始化器 {} 与 {{}}
- jmeter - 为 Jmeter 运行 200 个用户的硬件配置
- javascript - ExtJS 6. 带有抑制事件的网格复选框模型
- android - 通过桥发送一个 react native 容器,让本地代码显示图像
- shell - 脚本(shell 或批处理)删除/解析可能在 Jenkins 构建中使用的 pom.xml 依赖项的“快照字”
- javascript - 我想在 JavaScript 中创建星级。
- python - 从 Pandas 中的 iterrows() 获取行位置而不是行索引
- opengl - TEXTURE_2D_ARRAY 未渲染
- yaml - Open Shift yaml文件中的参数中的参数?
- java - 如何使用 Maven 加密密码——来自 Java?