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

时间:2014-02-25 10:09:05

标签: c++ qt user-interface layout qt4

我的QVBoxLayout包含一些自定义小部件,它们本身主要由标签和两个按钮组成。你几乎可以在某种程度上谈论某种自制餐桌。我知道有现成的桌面小部件可用,但我想使用我自己的。

我想要达到的目的是:当我点击其中一个小部件中的“向上”按钮时,它应该向上移动,或者换一种方式:它应该改变它在父{{1}内的当前位置/索引以每次点击向上移动一步(或相应地向下移动)的方式。那可能吗?我怎样才能做到这一点?我需要它作为一种用户友好的方式来设置该布局中的项目顺序。

我开始尝试从我的小部件中获取父布局:

QVBoxLayout

这似乎有效,但如何从这里继续?谢谢你的帮助!

2 个答案:

答案 0 :(得分:5)

您可以尝试这样的事情:

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;
}

答案 1 :(得分:0)

同意C.E. Gesser,在布局中没有像“setIndex”这样的界面布局项目。

如果你正在棋盘上实现象国际象棋这样的应用程序,那么移动小部件经常运行,QGraphicsView + QGraphicsItem(sa QWidgetItem)可能会有所帮助。

相关问题