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复制的伪代码。在某些情况下会发生这种情况。请看,您所做的是不受支持的。