Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: tillias от Февраль 08, 2007, 08:04



Название: QWidget::move() -- дети становятся невидимыми
Отправлено: 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;
}


Что я делаю не так?


Название: QWidget::move() -- дети становятся невидимыми
Отправлено: goer от Февраль 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 и все заработает.


Название: QWidget::move() -- дети становятся невидимыми
Отправлено: tillias от Февраль 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&)));
}


Название: QWidget::move() -- дети становятся невидимыми
Отправлено: goer от Февраль 08, 2007, 10:30
Проведи эксперимент:  не используй QPixmap. Кроме того, судя по документации, когда ты устанавливаешь пиксмапу для лэйбела, то предыдущий контент стирается, поэтому строчка  setText(tr("Test2")) не имеет смысла.

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

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

А вообще, если хочешь отображать картинки на форме, то лучше используй QFrame


Название: QWidget::move() -- дети становятся невидимыми
Отправлено: tillias от Февраль 08, 2007, 10:48
Цитировать

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


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

Цитировать

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


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

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


Название: QWidget::move() -- дети становятся невидимыми
Отправлено: goer от Февраль 08, 2007, 10:55
Цитировать

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


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


Цитировать

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


Видимо это от того что в теле paintEvent() ребенка ты не вызываешь  paintEvent() родителя (типа  QLabel::paintEvent())


Название: QWidget::move() -- дети становятся невидимыми
Отправлено: tillias от Февраль 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 );

не работает


Название: QWidget::move() -- дети становятся невидимыми
Отправлено: Вудруф от Февраль 12, 2007, 09:45
У меня такое ощущение, что ты просто "не туда" их передвигаешь. Чему равны значения ix и iy в последнем случае?