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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Родитель-ребенок [SOLVED]  (Прочитано 4611 раз)
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 минуту:

 Подскажите пожалуйста, где проблема?
Записан
Steven_Orko
Гость
« Ответ #1 : Февраль 03, 2007, 19:33 »

Цитата: "tillias"

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


Скорее проблемма в том, что ты их не размещаешь с помощью менеджеров компоновки. а если и размещаешь, то наверно, не заполняешь. Они и принимают такой размер, что ты их не видишь. Конечно, если других "косяков" в коде нет ))))
Записан
nova
Гость
« Ответ #2 : Февраль 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);

и наступит счастье Улыбающийся
Записан
kitov
Гость
« Ответ #3 : Февраль 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 .
Записан
Dendy
Гость
« Ответ #4 : Февраль 03, 2007, 20:07 »

Сейчас угадаю. В конструкторе Ramka родитель не передаётся в QLabel.

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


Надо:

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


Второй возможньІй косяк. Если окно бьІло показано ДО создания дочерних елементов на нём - последние будут скрьІтьІ. И им надо руками делать show().
Записан
tillias
Гость
« Ответ #5 : Февраль 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 минуту:

 В итоге не видна ни одна панель, цвет не меняется Грустный
Записан
Вячеслав
Гость
« Ответ #6 : Февраль 03, 2007, 22:13 »

Чей-то мне кажеться , что с приведенным кодом и не должно быть ничего видно Подмигивающий
QLabel'ам текст-то хто выдавать будет ?
или QLabel(tr("label1"))
или  test->setText(tr("label2")
Записан
tillias
Гость
« Ответ #7 : Февраль 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")));
Записан
nova
Гость
« Ответ #8 : Февраль 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.
Записан
tillias
Гость
« Ответ #9 : Февраль 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.


Спасибо! Тема закрыта
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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