Qt的上下文菜单实现方式要根据Widget的contextMenuPolicy(这是Widget的一个成员变量)来定。
1、自定义菜单
先在Widget初始化的时候调用
setContextMenuPolicy(Qt::CustomContextMenu);
指定该widget的上下文菜单是自定义的。
这里的自定义并不是说上下文菜单随意摆置内容-菜单怎么显示本来就是自定义。而是:实现上下文的方式或者说流程不同。
这里的流程是:
当上下文的行为(大多是右键点击)产生时,Qt底层会发出
customContextMenuRequested()
这个信号。
该信号定义在QWidget中:
Q_SIGNALS: void customContextMenuRequested(const QPoint &pos);
所以,我们要能得到上下文信号,只要做一个slot就可以。
这样,自定义形式下,就三步:
a、setContextMenuPolicy(Qt::CustomContextMenu);
b、连接信号和插槽,比如:
connect(this, SIGNAL (customContextMenuRequested(const QPoint&)), this, SLOT (contextMenu(const QPoint&)));
c、在插槽里实现具体的菜单内容,位置是信号传过来的。
应用场合:
QTableView继承类的上下文菜单
2、默认上下文菜单
这个相当于用
setContextMenuPolicy(Qt::DefaultContextMenu );
此种状况下,如果Widget中有重写的
void contextMenuEvent(QContextMenuEvent* event);
方法。这个方法在对应的时候就会激发。