QTableView 中鼠标左键单击和右键单击的区别

问题描述 投票:0回答:2

我有一个 QTableView,其中鼠标左键单击和右键单击都会导致某些操作。

右键单击应启动上下文菜单,左侧单击应打开另一个进程。

我在 QMainWindow 中使用以下连接来实现此目的:

connect(Table , SIGNAL( customContextMenuRequested( const QPoint& ) ),this, SLOT( tableContextMenu( const QPoint& ) ) );
 connect(Table , SIGNAL (clicked ( const QModelIndex&)), this, SLOT(test()));

这个问题很容易看出。由于我使用

clicked()
信号来捕获左键单击 - 右键单击也被捕获。因此,如果我单击右键单击按钮,以及上下文菜单,也会发生为左键单击保留的操作

如何避免这种情况?

Table = new QTableView(this);
TableLayout *t = new TableLayout();
Table->setModel(t);
Table->setContextMenuPolicy(Qt::CustomContextMenu);
connect(Table , SIGNAL( customContextMenuRequested( const QPoint& ) ),this, SLOT( tableContextMenu( const QPoint& ) ) );

这就是我为右键单击上下文菜单所做的操作,所有这些都在

P14MainWindow
构造函数中定义,它是
QMainWindow
的对象。

现在我到底应该在哪里重新实现

MouseReleaseEvent

qt mouseevent qtableview
2个回答
2
投票

要启动上下文菜单,请重新实现

QTableView::contextMenuEvent(QContextMenuEvent* e)
,并类似地重新实现
QTableView::mouse...Event(QMouseEvent* event)
以捕获鼠标事件。

然后使用

QTableView::indexAt(const QPoint& pos) const
返回点击站点的模型索引。

这是左键单击处理的示例:

void Table::mouseReleaseEvent(QMouseEvent* event)
{
    QTableView::mouseReleaseEvent( event );

    if ( event->button == Qt::LeftButton ) {
        test();
    }
}

0
投票

在连接到

QGuiApplication::mouseButtons
信号的插槽中使用
QAbstractItemView::clicked

#include <QApplication>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTableWidget tableWidget;
    QMenu rightButtonMenu;
    QMenu leftButtonMenu;
    QAction leftAction("Left Button");
    QAction rightAction("Right Button");

    tableWidget.setColumnCount(5);
    tableWidget.setRowCount(5);

    rightButtonMenu.addAction(&rightAction);
    leftButtonMenu.addAction(&leftAction);
    rightButtonMenu.setStyleSheet("background: white; color: black;");
    leftButtonMenu.setStyleSheet("background: black; color: white;");

    QObject::connect(&tableWidget, &QAbstractItemView::pressed, [&rightButtonMenu, &leftButtonMenu](const QModelIndex &index)
    {
        switch(QApplication::mouseButtons())
        {
            case Qt::RightButton:
                rightButtonMenu.exec(QCursor::pos());
                break;
            case Qt::LeftButton:
                leftButtonMenu.exec(QCursor::pos());
                break;
        }
    });

    tableWidget.show();

    return a.exec();
}

注意:这仅在单击某个项目时有效。您还可以将其应用于标题视图(例如,

QTableView::horizontalHeader
),因为QHeaderView继承了QAbstractItemView。

© www.soinside.com 2019 - 2024. All rights reserved.