我有一个 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
?
要启动上下文菜单,请重新实现
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();
}
}
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。