Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Андрей80 от Июль 13, 2010, 22:41



Название: Перемещение виджетов "вглубь" и "наружу".
Отправлено: Андрей80 от Июль 13, 2010, 22:41
Все здравствуйте.

Пишу редактор GUI-интерфейса.
Столкнулся  с такой проблемой: есть виджет, на который пользователь
может добавлять  различные другие виджеты - элементы ввода, изображения и т п.

Реализовано это таким образом:
Код
C++ (Qt)
/*Слот addObject вызывается всякий раз когда пользователь выбирает на
панели управления какой - нибудь элемент ввода - кнопку, список и т п.
*/

void Workspace::addObject(QString &objectType, QString &name, QString &uId, int &frameN, int &depth, QString &imagePath)
{
   if (!validType(objectType))
   {
       error("Неизвестный тип объекта\n" + objectType);
       return;
   }
 
   DrawObjectProperties props;
   props.type = objectType;
   props.depth = depth;
   props.name = name;
   props.caption = props.name;
   props.border  = false;
   props.color   = "#000000";
   props.imagePath = "";
   props.readOnly = false;
   props.style = "normal";
   props.textContent = "";
   props.uid = uId.toInt();
   props.textAlign = "left";
   props.x = 0;
   props.y = 0;
   props.w = 150;
   props.h = 40;
   if (objectType == "image")
   {
       QImage img(imagePath);
       props.w = img.width();
       props.h = img.height();
   }
   props.fontSize = 12;
   props.family = "Arial";
   props.imagePath = imagePath;
   //trace(props.type);
   createNewObject(props);
}
 
void Workspace::createNewObject(DrawObjectProperties props)
{
   IniFile ini;
   ini.loadFile(QApplication::applicationDirPath() + "/data/setting/paintarea.ini");
 
   DrawObject *o = new DrawObject(props, this->paintarea);
 
   o->show();
   o->setGeometry(props.x + ini["x"].toInt(), props.y + ini["y"].toInt(), props.w, props.h);
   connect(o, SIGNAL(modifySignal(DrawObjectProperties)), this, SLOT(onObjectModify(DrawObjectProperties)));
   connect(o, SIGNAL(modifyNameSignal(DrawObjectProperties)),
           this, SLOT(onObjectNameModify(DrawObjectProperties)));
   connect(o, SIGNAL(dropSignal(DrawObjectProperties)), this, SLOT(dropObject(DrawObjectProperties)));
   connect(o, SIGNAL(moveSignal(DrawObjectProperties,QString,int&)), this,
           SLOT(onSwap(DrawObjectProperties,QString,int&)));
   connect(o, SIGNAL(objectSelected(DrawObjectProperties)),
           this, SLOT(onObjectSelect(DrawObjectProperties)));
   connect(o, SIGNAL(copyPasteAction(QString)),
           this, SLOT(onCallCopyPaste(QString)));
      objectList.append(o);
}
 
Мне необходимо реализовать перемещение добавленных контролов "вперед" и "назад"
относительно друг друга то есть "вглубь" и "наружу".

Сейчас поступил так: При выборе контекстного меню "Переместить вперед" или
"Переместить назад"
   -Сохраняю свойства всех существующих на форме элементов,
   -удаляю все добавленные на форму элементы
Код
C++ (Qt)
void Workspace::clear()
{
   for (int i = 0; i < objectList.size(); i++)
   {
       delete objectList[i];
   }
   objectList.clear();
}
   -меняю в массиве копий свойств местами требуемые элементы
   -создаю заново все элементы в том порядке, в каком их свойства хранятся
      в массиве копий.

Все это мне не нравится. А как сделать правильно я не сообразил пока ещё...
Подскажите пожалуйста, как правильно сделать перемещение элементов относительно
друг друга?


Название: Re: Перемещение виджетов "вглубь" и "наружу".
Отправлено: asvil от Июль 13, 2010, 23:10
void QWidget::stackUnder ( QWidget * w )
Places the widget under w in the parent widget's stack.
To make this work, the widget itself and w must be siblings.

вызвать для виджета который должен быть "под" с параметром(виджет, который должен быть "над")


Название: Re: Перемещение виджетов "вглубь" и "наружу".
Отправлено: Андрей80 от Июль 13, 2010, 23:16
Большое спасибо.