提问人:user3204810 提问时间:6/1/2014 最后编辑:Shoeuser3204810 更新时间:12/4/2017 访问量:5994
QTableWidget 右键单击事件出现问题
Trouble with QTableWidget right-click event
问:
我能够通过子类化 QTableWidget 来模拟 Right-Click 事件:
头文件:
#ifndef QRIGHCLICKTABLE_H
#define QRIGHCLICKTABLE_H
#include <QTableWidget>
#include <QMouseEvent>
class QRightClickTable : public QTableWidget
{
Q_OBJECT
public:
explicit QRightClickTable(QWidget *parent = 0);
private slots:
void mousePressEvent(QMouseEvent *e);
signals:
void rightClicked();
public slots:
};
#endif // QRIGHCLICKTABLE_H
CPP 文件
QRightClickTable::QRightClickTable(QWidget *parent) :
QPushButton(parent)
{
}
void QRightClickTable::mousePressEvent(QMouseEvent *e)
{
if(e->button()==Qt::RightButton)
emit rightClicked();
}
QRightClickTable *button = new QRightClickTable(this);
ui->gridLayout->addWidget(button);
connect(button, SIGNAL(rightClicked()), this, SLOT(onRightClicked()));
void MainWindow::onRightClicked()
{
qDebug() << "User right clicked me";
}
现在,右键单击可以正常工作,但QTableWidget还有其他问题:所有其他鼠标事件(例如左键单击以选择单元格)都不再起作用。 你可以帮我吗?
答:
2赞
D Drmmr
6/2/2014
#1
您需要在重写中调用基类实现。假设您不希望右键单击事件也由以下人员处理:mousePressEvent
QTableView
void QRightClickTable::mousePressEvent(QMouseEvent* e)
{
if (e->button() == Qt::RightButton) {
emit rightClicked();
}
else {
QTableWidget::mousePressEvent(e);
}
}
3赞
Мишаков Максим
12/4/2017
#2
softwareTableWidget = new QTableWidget();
softwareTableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
QObject::connect(softwareTableWidget, &QTableWidget::customContextMenuRequested, this, [this](){
QMenu *menu = new QMenu;
auto a = menu->addAction("Test");
QObject::connect(a, &QAction::triggered, this, [this, menu, a](){
qDebug() << "Test";
a->deleteLater();
menu->deleteLater();
});
menu->exec(QCursor::pos());
menu->clear();
});
如果您只想在项目上显示上下文菜单,请单击然后添加以下内容:
if (softwareTableWidget->itemAt(softwareTableWidget->mapFromGlobal(QCursor::pos())))
{
QMenu *menu = new QMenu;
auto a = menu->addAction("Test");
QObject::connect(a, &QAction::triggered, this, [this, menu, a](){
qDebug() << "Test";
a->deleteLater();
menu->deleteLater();
});
menu->exec(QCursor::pos());
menu->clear();
}
当然,您可以做任何您想做的事情,而不是显示上下文菜单
评论
0赞
José Tomás Tocino
11/28/2018
这有效,但它正在泄漏内存,因为永远不会释放。您应该添加,以便在隐藏菜单时将其删除。QMenu
QObject::connect(menu, &QMenu::aboutToHide, menu, &QWidget::deleteLater);
评论
mousePressEvent