Russian Qt Forum
Октябрь 01, 2024, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWidget::move() -- дети становятся невидимыми  (Прочитано 4518 раз)
tillias
Гость
« : Февраль 08, 2007, 08:04 »

Здравствуйте!

Рзарабатываю виджет, который является контейнером ( экраном ) для болшого числа других ( 1000+ ).

Указатели на детей хранятся в веторе:

Код:
class MyWidget {
  vector< Childs * > body
...
}


После того как я по очереди прохожусь по вектору и для каждого ребенка вызываю ::move(), дети становятся невидимыми Грустный

Код:
...
float zoom_factor = 2;

vector< Childs* >::iterator Run = body.begin();
for ( ; Run != body.end(); ++Run ) {
  int ix = (*Run)->get_x_coord();
  int iy = (*Run)->get_y_coord();
  (*Run)->move( zoom_factor * ix, zoom_factor * iy;
}


Что я делаю не так?
Записан
goer
Гость
« Ответ #1 : Февраль 08, 2007, 09:46 »

Возможно, когда создаешь детей(они же виджеты) не указываешь родителя?

Еще проверь передаешь ли указатель на родителя в конструкторе MyWidget()

Надо что то типа такого:

Код:


class MyWidget:
    public QWidget
{
public:
    MyWidget(QWidget * parent = 0);
};


MyWidget::MyWidget(QWidget * parent):
    QWidget(parent)
{
    //Когда создаешь детей также не забудь передать им указатель на родительский виджет!!!

    QWidget * childWidget = new QWidget(this);
}



Может теперь, когда родители знают о своих детях, они смогут доставить им событие QPaintEvent и все заработает.
Записан
tillias
Гость
« Ответ #2 : Февраль 08, 2007, 09:54 »

Цитировать

Может теперь, когда родители знают о своих детях, они смогут доставить им событие QPaintEvent и все заработает.


Нет, с родителем все в порядке...
Однако PaintEvent не перегружен у детей, так как они представляют собой простой потомок QLabel, на котором размещен QPixmap

добавлено спустя 1 минуту:

 Вот как на родителя добавляется ребенок

Код:

void SpaceMap::addStarSystem( const star_system& obj )
{
x_offset = -1200;
y_offset = -761;
StarSystem *tmp_obj = new StarSystem( obj, x_offset, y_offset, this);

body.push_back( tmp_obj );
return;
}


добавлено спустя 1 минуту:

 А вот конструктор ребенка
Код:

StarSystem::StarSystem( const star_system& obj,
const int x_offset, const int y_offset,
QWidget *parent, const char *name )
  : QLabel( parent )
{
  body = obj;

resize( 20,20 );
setText(tr("Test2"));
normal = new QPixmap("1.png");
highlighted = new QPixmap("2.png");

setPixmap(*normal);
is_highlighted = false;
 
int x = body.ix - x_offset;
int y = body.iy - y_offset;
move( QPoint(x,y) );

// setting-up hint message
QString s_x = QString::number(body.ix);
QString s_y = QString::number(body.iy);
QString s_name = body.title.c_str();
setToolTip( QString( s_name + "  "  + s_x + ' ' + s_y));

connect( this, SIGNAL(system_is_selected(QString&)), parent, SLOT(select_system(QString&)));
}
Записан
goer
Гость
« Ответ #3 : Февраль 08, 2007, 10:30 »

Проведи эксперимент:  не используй QPixmap. Кроме того, судя по документации, когда ты устанавливаешь пиксмапу для лэйбела, то предыдущий контент стирается, поэтому строчка  setText(tr("Test2")) не имеет смысла.

Ключевое слово normal я нашел только у класса QPalette, поэтому у меня солжилось впечатление что в данном контексте ты используешь его в другом смысле. Также как и  highlighted.

Вобщем мой тебе совет - добейся сначала перемещения лэйбелов просто с текстом.

А вообще, если хочешь отображать картинки на форме, то лучше используй QFrame
Записан
tillias
Гость
« Ответ #4 : Февраль 08, 2007, 10:48 »

Цитировать

Ключевое слово normal я нашел только у класса QPalette, поэтому у меня солжилось впечатление что в данном контексте ты используешь его в другом смысле. Также как и highlighted.


Это просто имена пиксмапов, которые грузятся в компонент-ребенок.

Цитировать

Проведи эксперимент: не используй QPixmap.


Все равно при попытке сделать move() компоненты пропадают

Заметил одну вещь -- если у ребенка перегрузить paintEvent(), то компоненты не отображаются, даже в момент создания
Записан
goer
Гость
« Ответ #5 : Февраль 08, 2007, 10:55 »

Цитировать

Все равно при попытке сделать move() компоненты пропадают


Попробуй после move() вызвать update()


Цитировать

Заметил одну вещь -- если у ребенка перегрузить paintEvent(), то компоненты не отображаются, даже в момент создания


Видимо это от того что в теле paintEvent() ребенка ты не вызываешь  paintEvent() родителя (типа  QLabel::paintEvent())
Записан
tillias
Гость
« Ответ #6 : Февраль 08, 2007, 12:30 »

Цитировать

Попробуй после move() вызвать update()


Вставил update() куда только можно.
Пропадают и все тут Грустный

добавлено спустя 44 минуты:

 Есть одна зацепка:

Код:

(*Run)->move( 100, 100 );

работает

Код:

int ix = (*Run)->body.ix + x_offset;
int iy = (*Run)->body.iy + y_offset;
(*Run)->move( ix, iy );

не работает
Записан
Вудруф
Гость
« Ответ #7 : Февраль 12, 2007, 09:45 »

У меня такое ощущение, что ты просто "не туда" их передвигаешь. Чему равны значения ix и iy в последнем случае?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 20.