QTableWidget 左键单击 CustomContextMenu
QTableWidget Left Click CustomContextMenu
我有一个 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
的列 header 时,会出现此上下文菜单。
我想复制此行为,只是我希望它是左键单击而不是右键单击。
我试过添加 EventFilter
s 和其他东西,但没有任何效果。
谢谢
你必须使用QHeaderView
的sectionClicked
信号,所以你必须将customHeaderMenuRequested
参数从QPoint
更改为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());
}
我有一个 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
的列 header 时,会出现此上下文菜单。
我想复制此行为,只是我希望它是左键单击而不是右键单击。
我试过添加 EventFilter
s 和其他东西,但没有任何效果。
谢谢
你必须使用QHeaderView
的sectionClicked
信号,所以你必须将customHeaderMenuRequested
参数从QPoint
更改为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());
}