C++ 为什么在第一个元素将QAction插入末尾之前插入相同的QAction?

C++ 为什么在第一个元素将QAction插入末尾之前插入相同的QAction?,c++,qt,qt5,C++,Qt,Qt5,我尝试重新排序QMenu操作。在某些情况下,我会有类似bug的行为。让我们来看下一个代码: QMenu menu; QAction *a1 = menu.addAction("a1"); QAction *a2 = menu.addAction("a2"); QAction *a3 = menu.addAction("a3"); QAction *a4 = menu.addAction("a4"); menu.insertAction(a1, a1); for(QAction * a: me

我尝试重新排序
QMenu
操作。在某些情况下,我会有类似bug的行为。让我们来看下一个代码:

QMenu menu;
QAction *a1 = menu.addAction("a1");
QAction *a2 = menu.addAction("a2");
QAction *a3 = menu.addAction("a3");
QAction *a4 = menu.addAction("a4");

menu.insertAction(a1, a1);

for(QAction * a: menu.actions()){
    qDebug("%s", qPrintable(a->text()));
}
本刊:

a2
a3
a4
a1

对吗?我怀疑项目“a1”将保留在索引[0]中。

行为是正确的,这是insertAction方法的源代码

void QWidget::insertAction(QAction *before, QAction *action)
{
    if (Q_UNLIKELY(!action)) {
        qWarning("QWidget::insertAction: Attempt to insert null action");
        return;
    }
    Q_D(QWidget);
    if(d->actions.contains(action))
        removeAction(action);             //[1]
    int pos = d->actions.indexOf(before);            //[2]
    if (pos < 0) {
        before = 0;
        pos = d->actions.size();              //[3]
    }
    d->actions.insert(pos, action);        //[4]
    QActionPrivate *apriv = action->d_func();
    apriv->widgets.append(this);
    QActionEvent e(QEvent::ActionAdded, action, before);
    QCoreApplication::sendEvent(this, &e);
}
void QWidget::insertAction(QAction*before,QAction*action)
{
如果(Q_不太可能(!行动)){
qWarning(“QWidget::insertAction:尝试插入空操作”);
返回;
}
Q_D(QWidget);
如果(d->actions.contains(action))
移除动作(动作);//[1]
int pos=d->actions.indexOf(before);//[2]
如果(位置<0){
前=0;
pos=d->actions.size();//[3]
}
d->actions.insert(pos,action);//[4]
QActionPrivate*apriv=action->d_func();
apriv->widgets.append(这个);
QActionEvent e(QEvent::ActionAdded,action,before);
QCoreApplication::sendEvent(此,&e);
}
重要部分在第[1]、[2]和[3]行中

[1] 因为a1在列表中,它将被删除

[2] 由于a1不在列表中,因此位置为-1

[3] pos不是3,移除a1后列表的大小

[4] a1插入索引3

结果:

a2 a3 a4 a1


行为是正确的,这是insertAction方法的源代码

void QWidget::insertAction(QAction *before, QAction *action)
{
    if (Q_UNLIKELY(!action)) {
        qWarning("QWidget::insertAction: Attempt to insert null action");
        return;
    }
    Q_D(QWidget);
    if(d->actions.contains(action))
        removeAction(action);             //[1]
    int pos = d->actions.indexOf(before);            //[2]
    if (pos < 0) {
        before = 0;
        pos = d->actions.size();              //[3]
    }
    d->actions.insert(pos, action);        //[4]
    QActionPrivate *apriv = action->d_func();
    apriv->widgets.append(this);
    QActionEvent e(QEvent::ActionAdded, action, before);
    QCoreApplication::sendEvent(this, &e);
}
void QWidget::insertAction(QAction*before,QAction*action)
{
如果(Q_不太可能(!行动)){
qWarning(“QWidget::insertAction:尝试插入空操作”);
返回;
}
Q_D(QWidget);
如果(d->actions.contains(action))
移除动作(动作);//[1]
int pos=d->actions.indexOf(before);//[2]
如果(位置<0){
前=0;
pos=d->actions.size();//[3]
}
d->actions.insert(pos,action);//[4]
QActionPrivate*apriv=action->d_func();
apriv->widgets.append(这个);
QActionEvent e(QEvent::ActionAdded,action,before);
QCoreApplication::sendEvent(此,&e);
}
重要部分在第[1]、[2]和[3]行中

[1] 因为a1在列表中,它将被删除

[2] 由于a1不在列表中,因此位置为-1

[3] pos不是3,移除a1后列表的大小

[4] a1插入索引3

结果:

a2 a3 a4 a1


在动作之前插入动作的想法是什么???这是否回答了您的问题?这是一个带有bug复制的伪代码。在某些情况下会发生这种情况。请看,您所做的不受支持。在动作之前插入动作的想法是什么???这是否回答了您的问题?这是一个带有bug复制的伪代码。在某些情况下会发生这种情况。请看,您所做的是不受支持的。