Russian Qt Forum
Августа 27, 2025, 20:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать  (Прочитано 14774 раз)
marty
Гость
« : Декабря 04, 2008, 16:59 »

 Здравствуйте!

 Попробую описать задачу на примере программы с WTL.

VS2005, WTL 8.0
Визардом создал SDI приложение, сгенерированно меню, тулбар и дочернее окно, автоматически растягивющееся по всей клиентской области окана программы. В классе дочернего окна есть обработчик WM_PAINT, создается HDC, рисую на нем, все замечателольно.

VS2005, QT 4.4.3 + Qt integrator
Визардом создал (вроде бы) SDI приложения. С меню вроде разобрался, как хотя бы пункты добавлять, а как рисовать, так и не понял. Что надо добавить, какой-то контрол (widget)? Как сделать, чтобы он автоматически растягивался по размерам окна? Использовать какой-то layout менеджер? Полдня уже ковыряюсь, но понимания так и не достиг пока.

Не могли бы вы объЯснить мне по шагам, что куда ткнуть, какие свойства как настроить, как добавить обработчик перерисовки окна?
Я пока пытаюсь использовать дизайнер, так как в нем собственно мощь Qt и заключается, как я понял, ручками я и для WTL напишу. Есть пара книжек, но там они все ручками тоже пишут, а мне хотелось бы понять, как использовать дизайнер.

Вот такие вот проблемы, извините, если несколько сумбурно, только пытаюсь начать работу с Qt.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Декабря 04, 2008, 18:54 »

Я пока пытаюсь использовать дизайнер, так как в нем собственно мощь Qt и заключается
это тебе кто сказал?
Коль незнаешь как и начем в Qt рисовать, как сделать, чтобы растягивался виджет, лучше в коде все делай. Будешь уметь делать в коде, тогда Дизайнер будет тебе помошником
Записан

Юра.
marty
Гость
« Ответ #2 : Декабря 04, 2008, 19:42 »

 Хорошо, а как в коде сделать? Подмигивающий

Содрал все из какого-то примера, но там работает, а у меня не работает ;(

RenderArea - класс из examples/painting/transformations

Код
C++ (Qt)
// qtdraw.h
class qtdraw : public QMainWindow
{
   Q_OBJECT
 
public:
   qtdraw(QWidget *parent = 0, Qt::WFlags flags = 0);
   ~qtdraw();
 
private:
   //Ui::qtdrawClass ui;
 
   RenderArea *renderArea;
   QList<QPainterPath> shapes;
};
 
 
// qtdraw.cpp
qtdraw::qtdraw(QWidget *parent, Qt::WFlags flags)
   : QMainWindow(parent, flags)
{
   //ui.setupUi(this);
   renderArea = new RenderArea;
   QGridLayout *layout = new QGridLayout;
   layout->addWidget(renderArea, 0, 0);
   setLayout(layout);
 
   QPainterPath house;
//! [5]
   house.moveTo(-45.0, -20.0);
   house.lineTo(0.0, -45.0);
   house.lineTo(45.0, -20.0);
   house.lineTo(45.0, 45.0);
   house.lineTo(-45.0, 45.0);
   house.lineTo(-45.0, -20.0);
   house.addRect(15.0, 5.0, 20.0, 35.0);
   house.addRect(-35.0, -15.0, 25.0, 25.0);
 
   shapes.append(house);
 
   QPainterPath shape = shapes[0];
   renderArea->setShape(shape);
 
}
 
qtdraw::~qtdraw()
{
 
}
 

Компилируется, но не работает

//Пользуйся тегом КОД!
« Последнее редактирование: Декабря 04, 2008, 19:46 от pastor » Записан
marty
Гость
« Ответ #3 : Декабря 04, 2008, 19:48 »

 Я убрал из класса окна qtdraw  строчку
Ui::qtdrawClass ui;
решил, что сейчас она мне не нужна, убралось меню окна.

предполагал, что метод
void RenderArea::paintEvent(QPaintEvent *event)

вызывается при отрисовке, проверил отладчиком - не вызывается ни разу. Что и куда прислотить, присигналить или еще что-то сделать?

PS. Создал визардом приложение для wxWdgets. С помощью сэмплов минут за 10 разобрался, как рисовать, все заработало. А кьют что-то не дается мне ;(
Записан
marty
Гость
« Ответ #4 : Декабря 04, 2008, 19:49 »

Цитировать
//Пользуйся тегом КОД!

Ошибочка вышла, не в ту кнопку жмякнул, исправлюсь Подмигивающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Декабря 04, 2008, 19:52 »

Вместо:

Код
C++ (Qt)
renderArea = new RenderArea;
QGridLayout *layout = new QGridLayout;
layout->addWidget(renderArea, 0, 0);
setLayout(layout);

напиши

Код
C++ (Qt)
renderArea = new RenderArea;
setCentralWidget(renderArea);
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
marty
Гость
« Ответ #6 : Декабря 04, 2008, 19:55 »

Вместо:

Код
C++ (Qt)
renderArea = new RenderArea;
setCentralWidget(renderArea);

Спасибо, заработало. Вы не могли бы прокоментировать, почему не работал старый код?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Декабря 04, 2008, 20:01 »

Спасибо, заработало. Вы не могли бы прокоментировать, почему не работал старый код?

Когда используеться QMainWindow для него должен быть всегда! установлен центральный виджет, при помощи метода setCentralWidget. QMainWindow изначально имеет свой layout. А вы перетераете его своим и из этого как правило ничего хорошего не получаеться Улыбающийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
marty
Гость
« Ответ #8 : Декабря 04, 2008, 20:06 »

Вроде стало немного понятнее. Единственно, вопрос уже к кьюту - почему если я устанавливаю новый лэйаут, оно не далает чтоб все было хорошо? Подмигивающий

И второй вопрос, почему тогда работает сэмпл от кьюта, из которого я и выдрал этот код? Там как раз setLayout, а setCentralWidget не используется нигде в том проекте.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Декабря 04, 2008, 20:22 »

Вроде стало немного понятнее. Единственно, вопрос уже к кьюту - почему если я устанавливаю новый лэйаут, оно не далает чтоб все было хорошо? Подмигивающий
для того и сделана заготовка "QГлавноеОкно", что бы руками поменьше работать

И второй вопрос, почему тогда работает сэмпл от кьюта, из которого я и выдрал этот код? Там как раз setLayout, а setCentralWidget не используется нигде в том проекте.
а в этом примере есть "QГлавноеОкно"?
Записан

Юра.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Декабря 04, 2008, 20:26 »

Вроде стало немного понятнее. Единственно, вопрос уже к кьюту - почему если я устанавливаю новый лэйаут, оно не далает чтоб все было хорошо? Подмигивающий

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

И второй вопрос, почему тогда работает сэмпл от кьюта, из которого я и выдрал этот код? Там как раз setLayout, а setCentralWidget не используется нигде в том проекте.

В экзампле, с которого вы это взяли, юзаеется QWidget, а не QMainWindow. Так все будет работать нормально
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Декабря 04, 2008, 20:27 »

тактику (а может это и стратегия) можно выбрать такую. создаешь наследника, например, от QWidget. Учишся на нем рисовать или, что-то еще делать. Тестишь его, т.е. создаешь экземпляр в функции main (одно единственное окно у тебя будет). Как заработает можешь добавлять свой класс хоть в QMainWindow, хоть в другой виджет. А можешь добавить его в дизайнере: кладешь QWidget, а в свойствах указываешь, что он в действительности является MyWidget (см. promote to), во время работы в дизайнере будешь видеть пустой прямоугольник, но после компиляции программы увидишь свой виджет.
Записан

Юра.
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 865

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #12 : Декабря 05, 2008, 01:16 »

Я пока пытаюсь использовать дизайнер, так как в нем собственно мощь Qt и заключается
мощь Qt заключается в грамотном внутреннем дизайне
и в хорошей реализации изначально заложенной идеи: самого лучшего инструмента Улыбающийся
(с) глава из книги по Qt...
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
koe-kto
Гость
« Ответ #13 : Февраля 02, 2009, 20:11 »

Я пока пытаюсь использовать дизайнер, так как в нем собственно мощь Qt и заключается, как я понял, ручками я и для WTL напишу. Есть пара книжек, но там они все ручками тоже пишут, а мне хотелось бы понять, как использовать дизайнер.
Аналогичный вопрос - тоже начал разбираться в Qt с дизайнера, самому руками писать то, что можно сделать через дизайнер не хочется совершенно, а хочется именно понять как происходит RAD в Qt.
Читаю книжки и доки - везде всё делается через код, либо рассказывают про всякие layout'ы и т.п., а как доходит до добавления в форму action'ов - не совсем понятно, где сам код реализующий action'ы писать-то... Непонимающий То есть, для примера: в каком-нибудь Delphi или C# можно в визуал-едиторе потыкать в кнопочку, и попасть в соответствующее место в исходниках где будет автоматически создана функция-обработчик события... А здесь в Qt вообще такое есть?
(Использую Qt Creator (beta) + Qt 4.4.3 opensource edition)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #14 : Февраля 02, 2009, 20:38 »

А здесь в Qt вообще такое есть?

Нет, такого нет. Как пользоваться дизайнером, читаем в ассистанте - Qt Designer Manual
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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