Russian Qt Forum
Июля 03, 2025, 08:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] трабл с главным окном  (Прочитано 10990 раз)
bovka
Гость
« : Января 25, 2010, 12:09 »

доброго времени суток!
для меня QT - новьё, и вот я решил подробнее с ним познакмиться.
предоставляю вам код моего недоделыша, так как я не могу понять в чем проблема?? мне нужно, что в главном окне появлялись виджеты, которые я создаю, но у меня при компиляции появляется главное окно и еще отдельно виджеты, которые я создаю.
Код:
QApplication a(argc, argv);
    MainWindow w;
    QHBoxLayout*lay1=new QHBoxLayout;
    QHBoxLayout*lay2=new QHBoxLayout;
    QVBoxLayout*lay3=new QVBoxLayout;
    QLineEdit*edit1=new QLineEdit;
    QLineEdit*edit2=new QLineEdit;
    QLineEdit*edit3=new QLineEdit;
    QLineEdit*edit4=new QLineEdit;
    w.setLayout(lay3);
    lay3->addLayout(lay1);
    lay3->addLayout(lay2);
    lay1->addWidget(edit1);
    lay1->addWidget(edit2);
    lay2->addWidget(edit3);
    lay2->addWidget(edit4);
    edit1->show();
    edit2->show();
    edit3->show();
    edit4->show();
    w.show();
    return a.exec();
подскажите мне мою ошибку, пожалуйста
« Последнее редактирование: Января 26, 2010, 05:29 от bovka » Записан
DS_tm
Гость
« Ответ #1 : Января 25, 2010, 12:14 »

Во первых Вам не стоило использовать для этих целей QMainWindow, лучше наследовать от QDialog свой класс формы.
А во вторых не стоит вызывать у дочерних виджитов функцию show(). Родительский класс сам отобразит своих потомков, при правильном создании, конечно.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Января 25, 2010, 12:14 »

-    edit1->show();
-    edit2->show();
-    edit3->show();
-    edit4->show();
   w.setLayout(lay3); //после добавлени виджетов
« Последнее редактирование: Января 25, 2010, 12:16 от Авварон » Записан
bovka
Гость
« Ответ #3 : Января 25, 2010, 12:17 »

-    edit1->show();
-    edit2->show();
-    edit3->show();
-    edit4->show();
   w.setLayout(lay3); //после добавлени виджетов
неа, та же беда....
Записан
BRE
Гость
« Ответ #4 : Января 25, 2010, 12:19 »

Для всех дочерних виджетов нужно указывать parent, это то окно, которое будет ими владеть и на котором они будут располагаться.
Код
C++ (Qt)
QLineEdit*edit1=new QLineEdit( &w );
Посмотри примеры, которые идут с Qt - там все это есть.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Января 25, 2010, 12:27 »

установка лайаута вызывает репарент
также надо поменять добавление виджетов и добавление лайаутов в 3й лайаут
Записан
DS_tm
Гость
« Ответ #6 : Января 25, 2010, 12:40 »

С репарентом полностью согласен, ну а вообще, про последовательность использованийя операций setLayout и setWidget, разве есть разница, виджет перещитывает всю геометрию при вызове show(). На мой взгляд проблема всеже в лишних show и использовании QMainWindow, а точнее в том, что там надо использовать не лайот, а setCentralWidget. Добавте еще один виджет, разместите на него все лайоты и установите его на MainWindow с помощью функиции setCentralWidget.
Записан
BRE
Гость
« Ответ #7 : Января 25, 2010, 13:22 »

Давайте не будем так категоричны.  Улыбающийся
Мы обсуждаем конкретный пример с QMainWindow, давайте его немного упростим:
Код
C++ (Qt)
#include <QApplication>
#include <QMainWindow>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QDebug>
 
int main( int argc, char *argv[] )
{
       QApplication app( argc, argv );
 
       QMainWindow w;
       qDebug() << "w = " << &w;
       QVBoxLayout *layout = new QVBoxLayout;
       QLineEdit *edit = new QLineEdit;
       layout->addWidget( edit );
       qDebug() << "Parent edit = " << edit->parent();
       w.setLayout( layout );
       qDebug() << "Parent edit = " << edit->parent();
       w.show();
 
       return app.exec();
}
 
Цитировать
w =  QMainWindow(0x7fff2ad335e0)
Parent edit =  QObject(0x0)
QWidget::setLayout: Attempting to set QLayout "" on QMainWindow "", which already has a layout
Parent edit =  QObject(0x0)

Если добавить parent при создании QLineEdit, то он будет добавлен на QMainWindow, хотя с layout будут проблемы.
А вот если отказаться от QMainWindow в пользу QWidget, то действительно произойдет репарент и все будет нормально.

Хотя правильно, как сказал DS_tm, использование внутренний виджет+setCentralWidget, т.к. QMainWindow использует свой layout для размещения своих внутренних элементов.
« Последнее редактирование: Января 25, 2010, 13:25 от BRE » Записан
bovka
Гость
« Ответ #8 : Января 26, 2010, 05:28 »

Давайте не будем так категоричны.  Улыбающийся
Мы обсуждаем конкретный пример с QMainWindow, давайте его немного упростим:
Код
C++ (Qt)
#include <QApplication>
#include <QMainWindow>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QDebug>
 
int main( int argc, char *argv[] )
{
       QApplication app( argc, argv );
 
       QMainWindow w;
       qDebug() << "w = " << &w;
       QVBoxLayout *layout = new QVBoxLayout;
       QLineEdit *edit = new QLineEdit;
       layout->addWidget( edit );
       qDebug() << "Parent edit = " << edit->parent();
       w.setLayout( layout );
       qDebug() << "Parent edit = " << edit->parent();
       w.show();
 
       return app.exec();
}
 
Цитировать
w =  QMainWindow(0x7fff2ad335e0)
Parent edit =  QObject(0x0)
QWidget::setLayout: Attempting to set QLayout "" on QMainWindow "", which already has a layout
Parent edit =  QObject(0x0)

Если добавить parent при создании QLineEdit, то он будет добавлен на QMainWindow, хотя с layout будут проблемы.
А вот если отказаться от QMainWindow в пользу QWidget, то действительно произойдет репарент и все будет нормально.

Хотя правильно, как сказал DS_tm, использование внутренний виджет+setCentralWidget, т.к. QMainWindow использует свой layout для размещения своих внутренних элементов.

спасибо большое!!!=))))
очень рад тому, что люди не воротят голову от новичков, а пытаются помочь!)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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