右键菜单在一个项目中是必不可少的组件,在QT中的使用可能要比VS中使用复杂一些,尤其在QT中貌似只能用代码来实现。所以我们把建立右键菜单和绑定对应的事件,也就是从建立到使用逐步介绍给大家。
一、重写contextMenuEvent
为什么我们把这个类容放在最前面来说呢,因为没有他我们即使建立了右键菜单,我们也无法看到它弹出来让我们看见。所以,我们必须先重写contextMenuEvent,为什叫做重写呢,因为QT每个窗体中都已经包含了这个事件,我们也可以去窗体的信号槽中去看看是否有它的身影。
重写的格式如下:
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
}
这里的MainWindow是你自己的窗体。在这个函数体内,我们要定义好我们的右键菜单的弹出区域:
//把鼠标位置转化成相对于QWidget的位置,然后判断是否在tvRecipe内.
QPoint i = ui->tvRecipe->mapFromGlobal(event->globalPos());
QRect rect(QPoint(0,0),ui->tvRecipe->size());
if (rect.contains(i))
{
m_contextMenu->exec(event->globalPos());
}
二、建立右键菜单
我们建立右键菜单可以用两个地方是最佳的选择,第一个就是在窗体的构造函数中,第二个就是在上面我们重写的contextMenuEvent中。这都是可以的(我推荐在窗体的构造函数中),但建立右键菜单的代码没有什么变化的。如下:
窗体头文件中:
QMenu *m_contextMenu;
QAction *m_addAction;
QAction *m_explodeAction;
QAction *m_detailAction;
窗体cpp文件中:
m_contextMenu = new QMenu;
m_addAction = new QAction("增加项目",this);
m_detailAction=new QAction("项目详情",this);
m_explodeAction = new QAction("弹开所有",this);
m_contextMenu->addAction(m_addAction);
m_contextMenu->addAction(m_explodeAction);
m_contextMenu->addAction(m_detailAction);
三、绑定事件并使用
在绑定事件之前,我们必须建立信号槽事件函数,并且在头文件中声明:
窗体头文件中:
private slots:
void showDetail();
void addPatient();
void explodeAll();
窗体文件cpp中
connect(m_addAction, SIGNAL(triggered(bool)), this, SLOT(showDetail()));
connect(m_detailAction, SIGNAL(triggered(bool)), this, SLOT(addPatient()));
connect(m_explodeAction, SIGNAL(triggered(bool)), this, SLOT(explodeAll()));
上面的代码可以是在构造函数中也是可以是在contextMenuEvent中。
必须注意的是每一个QAction 类,都会作为信号槽连接的第一个参数,第二个参数则可以默认SIGNAL(triggered(bool)),第四个参数this,第五个参数就是你信号槽链接到你的执行函数了。
继续,我们在窗体cpp文件中实现刚刚信号槽链接的函数:
void MainWindow::showDetail()
{
QMessageBox::information(this,"","showdetail");
}
void MainWindow::addPatient()
{
QMessageBox::information(this,"","addPatient");
}
void MainWindow::explodeAll()
{
QMessageBox::information(this,"","explodeAll");
}
这样一来,你就可以顺利的使用你自己定义的右键菜单了。
四、有关QAction用法的补充
这里是QAction的一些用法,如果我们想让右键菜单内容更丰富,就在这里进行设置。
1、QAction::QAction ( const QString & text, QObject * parent )
QAction类的构造函数之一,利用text,parent创建QAction对象。QAction对象一般为菜单中的菜单项,比如 “文件"菜单中"新建"选项就是一个QAction对象,上述构造函数中text成员变量即为菜单项所表示的内容。
用法:QAction *newAction = new QAction(tr(”&New"),this);
2、void QAction::setIcon ( const QIcon & icon )
该函数可设置菜单项名称前的图标
用法:newAction->setIcon(QIcon(“:/images/new.png”));
3、void QAction::setShortcut ( const QKeySequence & shortcut );
设置QAction对象执行的快捷键
用法:newAction->setShortcut(tr(“Ctrl+N”));
4、void QAction::setStatusTip ( const QString & statusTip );
设置当鼠标移动到“动作”上时,状态栏显示的提示语。
5、void QAction::setVisible ( bool );
设置“动作”显示与否,当形参为true是,“动作”表示。
6、void QAction::triggered ( bool checked = false ) [signal]
此函数为信号,当用户触发此“动作”时,此信号发射。例如用户点击了菜单中的菜单项等。
此函数一般用法为:在QObject::connect()函数中作为信号参数,用于触发“动作”所对应执行的槽函数——实现“动作”的功能函数,例如:“新建”按钮被用户按下,所需要的功能可能是新建一个文档,那么新建一个文档的动作就在这个槽函数中实现。至于此信号函数中的形参暂时可以忽略。以后会在介绍QObject类中的静态方法connect()函数时详细解说。
7、void QAction::setCheckable ( bool );
此函数用于设置QAction类中的私有变量: bool checkable ,此属性用以提供“动作”是否为复选动作,例如Qt Creator中“控件”菜单中的“全屏”菜单项即为复选动作菜单