Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Замена объекта

Автор: aperon 13.6.2009, 15:10

Здравствуйте, форумчане. К примеру, в тулбаре имеем несколько объектов, среди которых QSlider. В процессе реботы программы есть необходимость заменить слайдер на другой объект, скжем Phonon::SeekSlider. Подскажите или ткните носом на ответ, как мне такое сделать, чтобы не потерялась очередность объектов в тулбаре или возможно ли такое вообще.

Автор: Litkevich Yuriy 13.6.2009, 15:58

Цитата(aperon @ 13.6.2009, 19:10) *
чтобы не потерялась очередность объектов в тулбаре или возможно ли такое вообще.
http://doc.crossplatform.ru/qt/4.5.0/qtoolbar.html#insertWidget Оно?

Автор: aperon 13.6.2009, 16:17

Цитата(Litkevich Yuriy @ 13.6.2009, 15:58) *
Цитата(aperon @ 13.6.2009, 19:10) *
чтобы не потерялась очередность объектов в тулбаре или возможно ли такое вообще.
http://doc.crossplatform.ru/qt/4.5.0/qtoolbar.html#insertWidget Оно?

Т.е, я вставляю то, что мне надо, а потом старое удаляю. Тогда получается, что в определенный момент, у меня в тулбаре будут присутствовать два слайдера, старый ненужный и новый? Так?


А просто заменить никак нельзя, правильно?

Автор: Litkevich Yuriy 13.6.2009, 17:16

Цитата(aperon @ 13.6.2009, 20:17) *
А просто заменить никак нельзя, правильно?
можно попробовать так:
Создаёшь указатель на QWidget
QWidget *wgt = 0;

В нужный момент инициализируешь его желаемым объектом.
wgt = new MyWidget(...);

А при смене удаляешь старый объект и переиницализирушь указатель новым
if (!wgt)
    delete wgt;
wgt = new MyNewWidget(...);


Но тогда пользоваться таким виджетом нужно с приведением типа, например:
MyNewWidget *w = qobject_cast<MyNewWidget *>(wgt);
w->someNewMetod();// Это метод класса MyNewWidget

или
MyWidget *w = qobject_cast<MyWidget *>(wgt);
w->someMetod();// Это метод класса MyWidget

В зависимости от того, какой виджет в данный момент используется

Автор: aperon 13.6.2009, 17:32

Вы точно обобщили суть задачи и ее решение. Большое спасибо. Насчет приведения, это понятно по-умолчанию. Жаль только, что нет возможности сделать такую операцию визуально незаметной.

Автор: Litkevich Yuriy 13.6.2009, 17:52

Цитата(aperon @ 13.6.2009, 21:32) *
Жаль только, что нет возможности сделать такую операцию визуально незаметной.
ну если тип виджета изменяется (и стало быть внешний вид), то этого уже не скроешь.

Чтобы дерготни было поменьше, можно для панели инструментов воспользоватся методом setUpdateEnable()

Автор: aperon 13.6.2009, 19:49

OK. Спасибо.

Автор: kwisp 15.6.2009, 7:57

Цитата(aperon @ 13.6.2009, 18:32) *
Жаль только, что нет возможности сделать такую операцию визуально незаметной.

у меня точно такая же задача стояла.
в resizeEvent() ToolBar`a сделал пропорциональное изменения его содержимого, и при замене действия либо виджета в нем слежу чтобы старый и новый виджет были одинакового размера -- визуально при замене ToolBar теперь не "скачет".

Автор: aperon 15.6.2009, 15:16

Спасибо.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)