我在事件过滤器中设置了一个大型菜单,右键单击45-50个动作 在里面我发现当我右键单击响应时显示菜单很慢 我在菜单中尝试了5个动作相同的代码,响应很好。 这种上下文菜单编码方式有问题吗?
eventFilter
bool Editor::eventFilter(QObject *o, QEvent *e)
{
Q_UNUSED (o);
QGraphicsSceneMouseEvent *me = (QGraphicsSceneMouseEvent*) e;
switch ((int) e->type()){
case QEvent::GraphicsSceneMousePress:{
switch ((int) me->button()){
case Qt::RightButton:{
QGraphicsItem *item = itemAt(me->scenePos());
showContextMenu(item->scenePos().toPoint());
return true;
}
//more cases here//
}
break;
}
}
return QObject::eventFilter(o, e);
}
showContextMenu
void Editor::showContextMenu(const QPoint &pos)
{
QGraphicsItem *item =itemAt(pos);
// Create main effe menu
effeMenu= new QMenu("Menu");
QString menuStyle(
"QMenu {"
"border:10px };"
//more code here
);
effeMenu->setStyleSheet(menuStyle);
AmpMenu=effeMenu->addMenu(QIcon(":/effectImg/img/effePng/amp.png"),"Amp");
Amp1 =AmpMenu->addAction(QIcon(":/effectImg/img/effePng/amp.png"),"Amp 1");
Amp2 =AmpMenu->addAction(QIcon(":/effectImg/img/effePng/amp.png"),"Amp 2");
CabMenu=effeMenu->addMenu(QIcon(":/effectImg/img/effePng/cab.png"),"Cab");
Cab1 =CabMenu->addAction(QIcon(":/effectImg/img/effePng/cab.png"),"Cab 1");
Cab2 =CabMenu->addAction(QIcon(":/effectImg/img/effePng/cab.png"),"Cab 2");
.
.
.
.
//45 actions more
connect(effeMenu, &QMenu::triggered,this,[this,&item](QAction * k){
menuSelection(k,item);
});
答案 0 :(得分:1)
您可以采取两项措施来提高速度:
1 - itemAt(pos)成本很高,而且你正在做两次,一次在事件中,一次在showContextMenu中。根据您的代码我可以理解,您不需要事件中的项目,只需在showMenu中。
2 - 您正在进行的菜单创建非常昂贵:所有操作都有pixmaps。这为QPixmap分配内存,加载,执行,转储。因为你告诉我们你使用了大约40个动作(实际上,这对于一个菜单来说太多了),这可能会花费很多。
我的建议: 为您的菜单创建一个类,创建它的一个实例,为您的菜单将使用的当前QGraphicsObject添加一个setter,并始终使用该实例。
答案 1 :(得分:1)
每次调用QMenu
时,您都可以使其成为类的成员并构建一次,而不是创建新的showContextMenu
。另一方面,没有必要使用信号,您只需使用exec()
的{{1}}方法:
<强> *的.h 强>
QMenu
<强> *。CPP 强>
class Editor: ...{
...
private:
QMenu effeMenu;
}