Все здравствуйте.
Пишу редактор 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();
}
-меняю в массиве копий свойств местами требуемые элементы
-создаю заново все элементы в том порядке, в каком их свойства хранятся
в массиве копий.
Все это мне не нравится. А как сделать правильно я не сообразил пока ещё...
Подскажите пожалуйста, как правильно сделать перемещение элементов относительно
друг друга?
Большое спасибо.