Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Sandr от Март 04, 2012, 22:08



Название: Button и Label в разных окнах 0_о
Отправлено: Sandr от Март 04, 2012, 22:08
Всем здрасте))
Осваиваю Qt 4.7 и пытаюсь создать окошко, в котором будут находиться кнопка и надпись. Вот код:

Код
C++ (Qt)
#include <QApplication>
#include <QLabel>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QLabel *label = new QLabel("Text");
label->show();
QPushButton *butt = new QPushButtob("Text");
butt->show();
return app.exec();
}
Запускаю, но почему-то создаются 2 окна, в одном из которых кнопка, а в другом лэйбел. Подскажите, что не так в этом коде, пожалуйста?


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Странник от Март 04, 2012, 22:19
чуть менее, чем все. посмотрите примеры. или книжку почтайте, что ли...Бланшета или того же Шлее.


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Bepec от Март 04, 2012, 22:20
Для того чтобы создать окно, тебе нужно создать класс типа QWidget/QMainWindow.
Он будет окном программы.
А далее при создании объектов указываешь им родителя - этот самый QWidget/QMainWindow.

Код:
	
int main(int argc, char *argv[])
{
 QApplication app(argc, argv);
 QWidget w;
 //QLabel  ( const QString & text, QWidget * parent = 0, Qt::WindowFlags f = 0 )
 QLabel *label = new QLabel("Text", w);
 //QPushButton ( const QString & text, QWidget * parent = 0 )
 QPushButton *butt = new QPushButtob("Text", w);
 w.show()
 return app.exec();
}

show() вызывается соответственно только для окна, а он уже сам вызывает для своих потомков ;)

offtop to Странник:

Почему то во всех учебниках по Qt, которые я видел, в примерах все виджеты создаются динамически. Без исключения  ;)
Это довольно странная вещь. Особенно когда я по книге написал программку, один интерфейс которой был примерно 1,5к строк ;)

И таки да, вопрос к Знающим. Если создать
Код:
// widget - объект типа QWidget
QLabel *lala = new QLabel("txt", widget)
То при уничтожении widget'a он уничтожит lala или нет?
 


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Sandr от Март 04, 2012, 22:22
Верес, большое спасибо за помощь :)


Название: Re: Button и Label в разных окнах 0_о
Отправлено: kambala от Март 04, 2012, 22:34
чтобы расположить виджет внутри чего-то, он должен иметь родителя (а именно это самое что-то). в ином случае (без родителя) виджет считается отдельным окном.
Код
C++ (Qt)
#include <QApplication>
#include <QLabel>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget w;
QLabel *label = new QLabel("Text", w);
QPushButton *butt = new QPushButtob("Text", w);
w.show();
return app.exec();
}
в этом самом простом случае оба элемента будут прилеплены к верхнему левому краю друг на друге. чтобы разместить их относительно нормально, надо воспользоваться менеджером компоновки (layout) - ручное позицирование предлагать не буду :)
Код
C++ (Qt)
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget w;
QLabel *label = new QLabel("Text", w);
QPushButton *button = new QPushButtob("Text", w);
QVBoxLayout *layout = new QVBoxLayout(&w);
layout->addWidget(label);
layout->addWidget(button);
w.show();
return app.exec();
}
эх, я тут написал, и всё зря :)
И таки да, вопрос к Знающим. Если создать
Код:
// widget - объект типа QWidget
QLabel *lala = new QLabel("txt", widget)
То при уничтожении widget'a он уничтожит lala или нет?
да, объект типа QObject уничтожает всех своих детей


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Bepec от Март 04, 2012, 22:38
Благодарю. Теперь запомню навеки.

Незря вы писали, у вас более подробный пример ;)


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Sandr от Март 04, 2012, 22:59
Верес, сейчас попробовал запустить, но выдаёт кучу ошибок.

kambala, ни разу не зря) Но в вашем примере также выводит ошибки.

В обоих примерах ошибки одинаковые, вот скрин ошибок http://s2.ipicture.ru/uploads/20120304/ORjUsI8O.gif


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Kurles от Март 04, 2012, 23:05
Я тоже написал, практически 1в1 как у kambala'ы :)
Код
C++ (Qt)
#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QDialog dlg;
   QVBoxLayout *layout = new QVBoxLayout();
   QLabel *label = new QLabel("Label");
   QPushButton *button = new QPushButton("Button");
   layout->addWidget(label);
   layout->addWidget(button);
   dlg.setLayout(layout);
   dlg.show();
   return a.exec();
}
 

а не компилируется у них, если присмотреться, потому что там, где функции требуется указатель на объект, передается сам объект, писали прямо в браузере видимо :)


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Sandr от Март 04, 2012, 23:10
Kurles, да мне хотя бы с простым выводом разобраться, а потом до позиционирования дойду))


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Kurles от Март 04, 2012, 23:14
У меня и так простой вывод, без позиционирования, по крайней мере ручного. Про компоновку (http://doc.crossplatform.ru/qt/4.7.x/layout.html) почитай.


Название: Re: Button и Label в разных окнах 0_о
Отправлено: kambala от Март 04, 2012, 23:47
писали прямо в браузере видимо :)
именно, с копипастой кода ТС :)


Название: Re: Button и Label в разных окнах 0_о
Отправлено: Sandr от Март 05, 2012, 00:31
Kurles, и вам так же спасибо))