c++ - QTableWidget 左键单击 CustomContextMenu

标签 c++ qt contextmenu qtablewidget

我有一个 QTableWidget,它目前有自己的自定义上下文菜单。这是用于设置它的代码:

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 和其他东西,但没有任何效果。

谢谢

最佳答案

您必须使用QHeaderViewsectionClicked 信号,因此您必须更改QPointcustomHeaderMenuRequested 参数为int,此参数将指示按下的列,获取几何位置使用QCursor::pos():

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

#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

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());
}

关于c++ - QTableWidget 左键单击 CustomContextMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49784570/

相关文章:

android - JNI - 无法在 Eclipse 中加载 OpenCV 的信息库

c++ - 可以使用默认参数复制包含 lambda 的 std::function 吗?

c# - VTK 渲染成 C#

c++ - 尝试从源构建 Qt 会导致错误

c++ - C++文字数组表示法

c++ - 使用 C 或 C++ 运行本地服务器的最佳方法

qt moc.exe 错误

android - 如何将数据从上下文菜单传递到 Android 中的警报对话框?

contextmenu - 如何自定义Slack Windows客户端的上下文菜单?

C# - DatagridView 和上下文菜单