要在某一个窗体中添加右键菜单,比如在QTableView中添加,可以用两种方式。
方式1:使用它的signal函数customContextMenuRequested(QPoint pos),这个信号会在右键点击时发射,将这个信号连接到一个自定义的slot函数中,在这个函数中定义一个右键菜单QMenu,然后根据位置参数pos弹出这个菜单即可。
方式2:重写contextMenuEvent(QContextMenuEvent *event)事件函数,函数中同样使用QMenu来实现。
信号/槽机制是QT的一个中心特征,也是Qt与其他工具包的最不相同的部分,下面是方式1实现一个右键菜单,函数中代码同样适用于方式2:
void MainWindow::on_tableView_customContextMenuRequested(QPoint pos)
{
QTreeWidgetItem* curItem=ui->treeWidget->itemAt(pos); //获取当前被点击的节点
if(curItem==NULL)return; //这种情况是右键的位置不在treeItem的范围内,即在空白位置右击
if(0==curItem->data(0,Qt::UserRole))//data(...)返回的data已经在之前建立节点时用setdata()设置好
{
QMenu *popMenu =new QMenu(this);//定义一个右键弹出菜单
popMenu->addAction(ui->action_newDB);//往菜单内添加QAction 该action在前面用设计器定义了
popMenu->addAction(ui->action_openDB);
popMenu->addAction(ui->action_delDB);
popMenu->exec(QCursor::pos());//弹出右键菜单,菜单位置为光标位置
}
else
{
QMenu *popMenu =new QMenu(this);//定义一个右键弹出菜单
popMenu->addAction(ui->action_newTable);//往菜单内添加QAction,该action在前面用设计器定义了
popMenu->addAction(ui->action_openTable);
popMenu->addAction(ui->action_designTable);
popMenu->exec(QCursor::pos());//弹出右键菜单,菜单位置为光标位置
}
}