首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >未调用QListView::doubleClicked的插槽

未调用QListView::doubleClicked的插槽
EN

Stack Overflow用户
提问于 2018-06-16 17:30:27
回答 1查看 1.1K关注 0票数 2

我有一个名为listView的QListView。它是MainWindow中唯一的小部件。我想跟踪listView上的双击情况。所以,我这样做了:

代码语言:javascript
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    listView = new QListView(this);

    this->setCentralWidget(listView);

    connect(listView, &QListView::doubleClicked, this, &MainWindow::onDoubleClicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow :: onDoubleClicked(const QModelIndex &index)
{
    QMessageBox :: information(this, "Info", "List view was double clicked at\nColumn: " + QString :: number(index.column()) + " and Row: " + QString::number(index.row()));
}

但是当我双击listView时,会出现一个get no消息框

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-17 03:52:09

如果对docs进行了审查:

void QAbstractItemView::doubleClicked(const QModelIndex &index)

此信号在双击鼠标按键时发出。鼠标双击的项目由索引指定。该信号仅在索引有效时发出。

在您的示例中,您的QListView没有模型,因此当您单击时没有有效的QModelIndex,因此信号将不会发出。

如果您想要跟踪双击事件,有两种可能的解决方案:

  • 创建QListView并覆盖mouseDoubleClickEvent事件。
  • 或使用事件筛选器。

在我的解决方案中,我将使用第二种方法:

*.h

代码语言:javascript
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QListView;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    bool eventFilter(QObject *watched, QEvent *event);

private:
    Ui::MainWindow *ui;
    QListView *listView;
};


#endif // MAINWINDOW_H

*.cpp

代码语言:javascript
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QEvent>
#include <QListView>
#include <QMouseEvent>

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    listView = new QListView;
    this->setCentralWidget(listView);

    listView->viewport()->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == listView->viewport() && event->type() == QEvent::MouseButtonDblClick){
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        qDebug()<<"MouseButtonDblClick"<<mouseEvent->pos();
    }
    return QMainWindow::eventFilter(watched, event);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50886652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档