首页 > 解决方案 > 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.

请指出如何更好地解决此问题的正确方向。

标签: c++qtc++11qt5qtableview

解决方案


推荐阅读