Russian Qt Forum

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



Название: Родитель-ребенок [SOLVED]
Отправлено: tillias от Февраль 03, 2007, 19:20
Здравствуйте!

Создаю тестовую иерархию:

Код:
class Ramka : public QLabel {
...};


Далее панель, на которой хочу отобразить много таких рамок:

Код:
class MnogoRamok : public QWidget {
public:
  Ramka *test
  Ramka *test2
  ...
}


Конструктор главного виджета MnogoRamok по очереди создает *test и *test2.

MnogoRamok::MnogoRamok( QWidget *parent, const char *name ) :
  QWidget( parent )
{
  test = new Ramka(this);
  test.setPalette( QPalette(QColor("red")));
  test2 = new Ramka2(this);
  ...
}

Проблема в том, что хоть рамки и создаюься, но визуально не отображаются... В чем может быть проблема?

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

 Если модифицировать конструктор ( убрать родителя ):

Код:

test = new Ramka()
test2 = new Ramka2()
test->show();
test2->show();


То все работает. НО, так как родителем является app, то главный виджет выводится отдельным окном, а тестовые лабелы test и test2 тоже отдельными окнами.

Мне же хочется, чтобы выводился главный виджет,  а уже на нем создавались лабелы. Все в одном окне

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

 Подскажите пожалуйста, где проблема?


Название: Родитель-ребенок [SOLVED]
Отправлено: Steven_Orko от Февраль 03, 2007, 19:33
Цитата: "tillias"

 Подскажите пожалуйста, где проблема?


Скорее проблемма в том, что ты их не размещаешь с помощью менеджеров компоновки. а если и размещаешь, то наверно, не заполняешь. Они и принимают такой размер, что ты их не видишь. Конечно, если других "косяков" в коде нет ))))


Название: Родитель-ребенок [SOLVED]
Отправлено: nova от Февраль 03, 2007, 19:37
Добавь:
Код:

test = new Ramka(this);
test.setPalette( QPalette(QColor("red")));
test2 = new Ramka2(this);
QVBoxLayout *vboxLayout = new QVBoxLayout(this);
vboxLayout->addWidget(test);
vboxLayout->addWidget(test2);

и наступит счастье :)


Название: Родитель-ребенок [SOLVED]
Отправлено: kitov от Февраль 03, 2007, 19:43
Цитата: "nova"
Добавь:
Код:

test = new Ramka(this);
test.setPalette( QPalette(QColor("red")));
test2 = new Ramka2(this);
QVBoxLayout *vboxLayout = new QVBoxLayout(this);
vboxLayout->addWidget(test);
vboxLayout->addWidget(test2);

и наступит счастье :)


При создании "Ramka" не надо указывать родителя(в этом случае)
ибо им становится layout manager после addwidget .


Название: Родитель-ребенок [SOLVED]
Отправлено: Dendy от Февраль 03, 2007, 20:07
Сейчас угадаю. В конструкторе Ramka родитель не передаётся в QLabel.

Код:
Ramka::Ramka( QWidget * parent )
{
  ...
}


Надо:

Код:
Ramka::Ramka( QWidget * parent ) :
  QWidget( parent )
{
  ...
}


Второй возможньІй косяк. Если окно бьІло показано ДО создания дочерних елементов на нём - последние будут скрьІтьІ. И им надо руками делать show().


Название: Родитель-ребенок [SOLVED]
Отправлено: tillias от Февраль 03, 2007, 22:03
Приведу итоговый рузультат:
( Вообще ничего не создается :(

Код:
class MWidget :
  public QWidget
{
Q_OBJECT
  public:
 MWidget( QWidget *parent = 0, const char *name = 0 );
 ~MWidget();
private:
 QLabel *test, *test2;
};


И реализация:

Код:
MWidget::MWidget( QWidget *parent, const char *name )
  : QWidget( parent )
{
  test = new QLabel();
  test2 = new QLabel();
  test->setPalette( QPalette(QColor("red")));
  QVBoxLayout *tt = new QVBoxLayout(this);
  tt->addWidget(test);
  tt->addWidget(test2);

}



Вызов:

Код:
int main( int argc, char *argv[] )
{
  QApplication app( argc, argv );
MWidget m;
m.show();


return app.exec();
}


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

 В итоге не видна ни одна панель, цвет не меняется :(


Название: Родитель-ребенок [SOLVED]
Отправлено: Вячеслав от Февраль 03, 2007, 22:13
Чей-то мне кажеться , что с приведенным кодом и не должно быть ничего видно ;)
QLabel'ам текст-то хто выдавать будет ?
или QLabel(tr("label1"))
или  test->setText(tr("label2")


Название: Родитель-ребенок [SOLVED]
Отправлено: tillias от Февраль 03, 2007, 22:57
Цитировать

QLabel'ам текст-то хто выдавать будет ?


Спасибо! Осталось только разобраться почему виджеты не меняют цвет при помощи

Код:

test = new QLabel("test");
test->setPalette( QPalette(QColor("red")))


, однако если они не в Layout контейнере, то с цветом все в поряде.

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

 Цвет однако меняется для родительского компонента MWidget ( который содержит лабелы test и test2 ).

Поодиночке же нет:
Код:

  test = new QLabel();
  test->setText(tr("Label1"));

  test2 = new QLabel();
  test2->setText(tr("Lanbe2"));

  QVBoxLayout *tt = new QVBoxLayout(this);
  tt->addWidget(test);
  tt->addWidget(test2);

  test->setPalette(QPalette(QColor("blue")));
  test->setPalette(QPalette(QColor("blue")));


Название: Родитель-ребенок [SOLVED]
Отправлено: nova от Февраль 04, 2007, 11:36
Может потому что:
Цитировать

Note: The palette's background color will only have an effect on the appearance of the widget if the autoFillBackground property is set.


Название: Родитель-ребенок [SOLVED]
Отправлено: tillias от Февраль 04, 2007, 11:53
Цитата: "nova"
Может потому что:
Цитировать

Note: The palette's background color will only have an effect on the appearance of the widget if the autoFillBackground property is set.


Спасибо! Тема закрыта