2013-02-12 74 views
1
左和右键点击区分

我有一个QTableView中,其中两个左和右击鼠标导致一些工作,在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

回答

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

我试过了。我把'连接(表,SIGNAL(mousePressEvent(QMouseEvent *)),这一点,SLOT(测试(QMouseEvent *)));'和'测试(QMouseEvent *)',我检查哪个按钮被点击等等。但是,我总是在调试窗口的消息**对象::连接:没有这样的信号QTableView中:: mousePressEvent(QMouseEvent *)** – user1173240 2013-02-12 10:49:07

+0

犯错......他们不是插槽。它们是通过对象的事件分派器从事件队列中接收事件的方法。阅读文档:http://qt-project.org/doc/qt-4.8/eventsandfilters.html – cmannett85 2013-02-12 10:52:45

+0

Ah..context菜单不是问题。那么,我知道我怎么才能用'clicked()'信号来做到这一点。所以它进入'test()'插槽,我可以确定哪个按钮被点击过,避免右键点击,只要点击鼠标左键就可以继续。这会让事情变得更简单,而不是重新实现。 – user1173240 2013-02-12 11:15:11