• 5198阅读
  • 5回复

右击发出的又是什么信号? [复制链接]

上一主题 下一主题
离线iiiyyyhhhsss
 

只看楼主 倒序阅读 楼主  发表于: 2009-09-12
widget的manul里找不到任何关于right-click...
离线iiiyyyhhhsss

只看该作者 1楼 发表于: 2009-09-12
http://yueyueniao526.blog.163.com/blog/static/49347469200921312910842/


QT中实现上下文菜单
QT   2009-03-13 13:29   阅读143   评论0  
字号: 大大  中中  小小

在许多的应用程序中,当我们右击时会弹出一个菜单,这个菜单就叫做“上下文菜单”,英文名称为“Context Menu”.在QT中有两种方式可以实现这种上下文菜单,一一列举如下:

   一.重载contextMenuEvent()函数,一个简单的示例如下:

void MainWindow::contextMenuEvent(QContextMenuEvent *event)

{

  filemenu->addAction(newAction);

  filemenu->addAction(editAction);

  filemenu->addAction(delAction);

  filemenu->exec(QCursor::pos());         //位于鼠标点击处

  //filemenu->exec(this->mapToGlobal(QPoint(0,0)));

//位于父组件的(0,0)坐标处

  //event->accept();//有时候需要加上这句,因为许多情况下默认为ignore事件

}

  二.在类的构造函数中进行相关设置,如我们可以定义如下函数,再在构造函数中调用它

void MainWindow::createContextMenu()

{

  addAction(newAction);

  addAction(editAction);

  addAction(delAction);

  setContextMenuPolicy(Qt::ActionsContextMenu);

}



   其中

Qt::ActionsContextMenu是位于Qt命名空间的一个枚举类型,它的定义为:

  enum Qt::ContextMenuPolicy

  This enum type defines the various policies a widget can have with respect to showing a context menu.

Qt::NoContextMenu        0     the widget does not feature a context menu, context menu handling is deferred to the widget's parent.

Qt::DefaultContextMenu   1     the widget's QWidget::contextMenuEvent() handler is  called.

Qt::ActionsContextMenu   2     the widget displays its QWidget::actions() as context menu.

Qt::CustomContextMenu    3     the widget emits the QWidget::customContextMenuRequested() signal.

Qt::PreventContextMenu   4     the widget does not feature a context menu, and in contrast to NoContextMenu, the handling is not deferred to the widget's parent. This means that all right mouse button events are guaranteed to be delivered to the widget itself through mousePressEvent(), and mouseReleaseEvent().

   今天又在书上看到这么一段话,刚好可以用在这里,首先来看一下这段话:

   Creating modal dialogs and context menus in QWidget::contextMenuEvent() reimplementations on the stack is a common programming pattern since we usually don't need the dialog or menu after we have used it,and it will automatically be destroyed at the end of the enclosing scope.

  根据这段话所说,我们要对程序进行修改的话,只需要把QMenu与QAction的实例化放在相应的函数里面,可以直接用一个变量,也可以用new,不过用new的时候要记得在函数结尾处要调用delete。这个比较简单,就不在这里列出相应的代码了。
离线dbzhang800

只看该作者 2楼 发表于: 2009-09-12
引用楼主iiiyyyhhhsss于2009-09-12 09:14发表的 右击发出的又是什么信号? :
widget的manul里找不到任何关于right-click...


如果你需要QWidget的是鼠标的点击事件(任何一个键),显然都是

virtual void mouseMoveEvent ( QMouseEvent * event )
virtual void mousePressEvent ( QMouseEvent * event )

而看楼上你楼上的帖子,好像你关注的是上下文菜单,这又是另一个问题了。上下文菜单一般不知鼠标右键可以调出,键盘上某些键也可调出。也就是该事件与鼠标右击有些区别的。
离线iiiyyyhhhsss

只看该作者 3楼 发表于: 2009-09-12
但是我发现,基本上所有的右击动作都是用来调出一些菜单的啊。。

那么,我们在界面上右击各个不同的部件,得出不同的菜单,是直接采用上下文菜单的方法,还是建立一些信号槽使右击调出菜单的方法呢?二者那个更为常用?

例如我现在想在托盘上右击,然后调出一个菜单,是应该重写托盘的上下文菜单事件吗?
离线dbzhang800

只看该作者 4楼 发表于: 2009-09-12
你用上下文菜单的话,肯定就是选用,上下文菜单事件了。

但你的标题是右键单击,我只是想说,右键单击不等于从下文菜单事件

有的画图软件,鼠标左键开始画图动作,右键单击结束等

再比如,通过键盘也可调出上下文菜单,也就是可以触发上下文菜单事件,与右键没关系
离线rqzrqh

只看该作者 5楼 发表于: 2009-09-12
也许没有这种信号。信号是由事件来的,自己在mousePressEvent ( QMouseEvent * event )中判断一下右键就行了
快速回复
限100 字节
 
上一个 下一个