c++ 如何以编程方式更改布局中小部件的顺序?

tnkciper  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(198)

我确实有一个QVBoxLayout,它包含了一些自定义的小部件,这些小部件本身主要由一个标签和两个按钮组成。在某种程度上,你几乎可以说是某种自制的表格。我知道有现成的表格小部件可用,但我想使用我自己的。
我想要达到的是:当我点击其中一个小部件中的“向上”按钮时,它应该向上移动,或者换一种说法:它应该改变它在父QVBoxLayout中的当前位置/索引,每次单击它都向上移动一步(或相应地向下移动一步)。这可能吗?我如何实现这一点?我需要它作为一种用户友好的方式来设置该布局中项目的顺序。
我首先尝试从我的小部件中获取父布局:

QVBoxLayout* myLayout = qobject_cast<QVBoxLayout*>(this->parentWidget());

这似乎是可行的,但如何从这里继续下去?谢谢你的帮助!

bjp0bcyl

bjp0bcyl1#

你可以试试这样的方法:

enum MoveDirection { MoveUp, MoveDown };
bool move(QWidget *widget, MoveDirection direction) {
  QVBoxLayout* myLayout = qobject_cast<QVBoxLayout*>(widget->parentWidget()->layout());

  //Gets the index of the widget within the layout
  const int index = myLayout->indexOf(widget); 

  if (direction == MoveUp && index == 0) {
    //Can't move up
    return false;
  }

  if (direction == MoveDown && index == myLayout->count()-1 ) {
    //Can't move down
    return false;
  }

  //Compute new index according to direction
  const int newIndex = direction == MoveUp ? index - 1 : index + 1;
  //Remove widget from layout
  myLayout->removeWidget(widget);
  //Insert widget at new position
  myLayout->insertWidget(newIndex , widget);

  return true;
}
3npbholx

3npbholx2#

同意C.E. Gesser的观点,布局中的布局项没有类似“setIndex”的接口。
如果您正在实现一些应用程序,如棋盘上的国际象棋,其中移动小部件操作频繁,QGraphicsView + QGraphicsItem(sa QWidgetItem)可能会有所帮助。

2nbm6dog

2nbm6dog3#

删除和重新创建小部件每次都会消耗内存。换句话说,删除小部件不会在运行时释放内存。您应该为所需的小部件使用setCurrentIndex()插槽

相关问题