首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTableWidget左击CustomContextMenu

QTableWidget左击CustomContextMenu
EN

Stack Overflow用户
提问于 2018-04-11 21:13:52
回答 1查看 406关注 0票数 1

我有一个QTableWidget,它现在有自己的自定义上下文菜单。下面是用来设置它的代码:

代码语言:javascript
复制
MyClass::MyClass()
{
    m_table->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);

    connect(m_table->horizontalHeader(), SIGNAL(customContextMenuRequested(QPoint)), SLOT(customHeaderMenuRequested(QPoint)));
}

void MyClass::customHeaderMenuRequested(QPoint pos)
{
    int columnClicked = m_table->horizontalHeader()->logicalIndexAt(pos);

    QMenu * menu = new QMenu(this);
    actNone = new QAction("-", this);
    menu->addAction(actNone);
    .
    .
    .
    menu->popup(m_table->horizontalHeader()->viewport()->mapToGlobal(pos));
}

当用户右键单击QTableWidget列标题时,就会出现此上下文菜单。

我想复制这种行为,但我希望它是一个左键,而不是右键单击。

我尝试过添加EventFilter和其他东西,但是没有什么效果。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-11 21:45:35

您必须使用sectionClicked信号的QHeaderView,所以您必须将customHeaderMenuRequested参数从QPoint更改为int,此参数将指示按下的列,以获得几何位置QCursor::pos()

代码语言:javascript
复制
MyClass::MyClass()
{
    ...
    connect(m_table->horizontalHeader(), &QHeaderView::sectionClicked, this, &MainWindow::customHeaderMenuRequested);

}

void MyClass::customHeaderMenuRequested(int section)
{
    qDebug()<<section;
    QMenu * menu = new QMenu(this);
    QAction *actNone = new QAction("-", this);
    menu->addAction(actNone);
    menu->popup(QCursor::pos());
}

更新:

更好的解决方案是实现自定义的QHeaderView

headerview.h

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

#include <QHeaderView>
#include <QMouseEvent>

class HeaderView : public QHeaderView
{
    Q_OBJECT
public:
    using QHeaderView::QHeaderView;
protected:
    void mousePressEvent(QMouseEvent *event){
        if(event->buttons() == Qt::LeftButton)
            emit customSignal(logicalIndexAt(event->pos()));
        QHeaderView::mousePressEvent(event);
    }
signals:
    void customSignal(int section);
};

#endif // HEADERVIEW_H
代码语言:javascript
复制
MyClass::MyClass()
{
    ...
    HeaderView *horizontal_header = new HeaderView(Qt::Horizontal);
    m_table->setHorizontalHeader(horizontal_header);
    connect(horizontal_header, &HeaderView::customSignal, this, &MainWindow::customHeaderMenuRequested);

}

void MyClass::customHeaderMenuRequested(int section)
{
    qDebug()<<section;
    QMenu * menu = new QMenu(this);
    QAction *actNone = new QAction("-", this);
    menu->addAction(actNone);
    menu->popup(QCursor::pos());
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49784570

复制
相关文章

相似问题

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