Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: marty от Декабря 04, 2008, 16:59



Название: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: 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.


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: lit-uriy от Декабря 04, 2008, 18:54
Я пока пытаюсь использовать дизайнер, так как в нем собственно мощь Qt и заключается
это тебе кто сказал?
Коль незнаешь как и начем в Qt рисовать, как сделать, чтобы растягивался виджет, лучше в коде все делай. Будешь уметь делать в коде, тогда Дизайнер будет тебе помошником


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: marty от Декабря 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()
{
 
}
 

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

//Пользуйся тегом КОД!


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: marty от Декабря 04, 2008, 19:48
 Я убрал из класса окна qtdraw  строчку
Ui::qtdrawClass ui;
решил, что сейчас она мне не нужна, убралось меню окна.

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

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

PS. Создал визардом приложение для wxWdgets. С помощью сэмплов минут за 10 разобрался, как рисовать, все заработало. А кьют что-то не дается мне ;(


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: marty от Декабря 04, 2008, 19:49
Цитировать
//Пользуйся тегом КОД!

Ошибочка вышла, не в ту кнопку жмякнул, исправлюсь ;)


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: pastor от Декабря 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);


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: marty от Декабря 04, 2008, 19:55
Вместо:

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

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


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: pastor от Декабря 04, 2008, 20:01
Спасибо, заработало. Вы не могли бы прокоментировать, почему не работал старый код?

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


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: marty от Декабря 04, 2008, 20:06
Вроде стало немного понятнее. Единственно, вопрос уже к кьюту - почему если я устанавливаю новый лэйаут, оно не далает чтоб все было хорошо? ;)

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


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: lit-uriy от Декабря 04, 2008, 20:22
Вроде стало немного понятнее. Единственно, вопрос уже к кьюту - почему если я устанавливаю новый лэйаут, оно не далает чтоб все было хорошо? ;)
для того и сделана заготовка "QГлавноеОкно", что бы руками поменьше работать

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


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: pastor от Декабря 04, 2008, 20:26
Вроде стало немного понятнее. Единственно, вопрос уже к кьюту - почему если я устанавливаю новый лэйаут, оно не далает чтоб все было хорошо? ;)

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

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

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


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: lit-uriy от Декабря 04, 2008, 20:27
тактику (а может это и стратегия) можно выбрать такую. создаешь наследника, например, от QWidget. Учишся на нем рисовать или, что-то еще делать. Тестишь его, т.е. создаешь экземпляр в функции main (одно единственное окно у тебя будет). Как заработает можешь добавлять свой класс хоть в QMainWindow, хоть в другой виджет. А можешь добавить его в дизайнере: кладешь QWidget, а в свойствах указываешь, что он в действительности является MyWidget (см. promote to), во время работы в дизайнере будешь видеть пустой прямоугольник, но после компиляции программы увидишь свой виджет.


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: panAlexey от Декабря 05, 2008, 01:16
Я пока пытаюсь использовать дизайнер, так как в нем собственно мощь Qt и заключается
мощь Qt заключается в грамотном внутреннем дизайне
и в хорошей реализации изначально заложенной идеи: самого лучшего инструмента :)
(с) глава из книги по Qt...


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: koe-kto от Февраля 02, 2009, 20:11
Я пока пытаюсь использовать дизайнер, так как в нем собственно мощь Qt и заключается, как я понял, ручками я и для WTL напишу. Есть пара книжек, но там они все ручками тоже пишут, а мне хотелось бы понять, как использовать дизайнер.
Аналогичный вопрос - тоже начал разбираться в Qt с дизайнера, самому руками писать то, что можно сделать через дизайнер не хочется совершенно, а хочется именно понять как происходит RAD в Qt.
Читаю книжки и доки - везде всё делается через код, либо рассказывают про всякие layout'ы и т.п., а как доходит до добавления в форму action'ов - не совсем понятно, где сам код реализующий action'ы писать-то... ??? То есть, для примера: в каком-нибудь Delphi или C# можно в визуал-едиторе потыкать в кнопочку, и попасть в соответствующее место в исходниках где будет автоматически создана функция-обработчик события... А здесь в Qt вообще такое есть?
(Использую Qt Creator (beta) + Qt 4.4.3 opensource edition)


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: pastor от Февраля 02, 2009, 20:38
А здесь в Qt вообще такое есть?

Нет, такого нет. Как пользоваться дизайнером, читаем в ассистанте - Qt Designer Manual (http://doc.trolltech.com/4.4-snapshot/designer-manual.html)


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: koe-kto от Февраля 03, 2009, 07:14
Хмм, а вот это зря... :-\ Получается я должен вручную и в хедере и в .cpp-файле функции добавлять...

Чтение Qt Designer Manual-а пока дает мне больше вопросов чем ответов, особенно в связи с отличиями Qt Designer-а и соотв.части Qt Creator-а ???

А вот ещё вопрос из той же серии: есть ли в Qt набор "стандартных" картинок/иконок для обозначения действий "New", "Open", "Save", "Cut/Copy/Paste" и т.д.?
В инете нахожу что вроде бы есть такое, а где конкретно? (В примерах встречаются иногда, но не полный набор)


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: pastor от Февраля 03, 2009, 12:21
Получается я должен вручную и в хедере и в .cpp-файле функции добавлять...

Да. В дизайнере можно создать коннекты стандартных сигналов к стандартным слотам.

Чтение Qt Designer Manual-а пока дает мне больше вопросов чем ответов, особенно в связи с отличиями Qt Designer-а и соотв.части Qt Creator-а ???

Qt Creator не использую, но думаю Qt Designer и в Африке Qt Designer ;)

А вот ещё вопрос из той же серии: есть ли в Qt набор "стандартных" картинок/иконок для обозначения действий "New", "Open", "Save", "Cut/Copy/Paste" и т.д.?
В инете нахожу что вроде бы есть такое, а где конкретно? (В примерах встречаются иногда, но не полный набор)

Набора иконок нет. Да и правильно что нет. Все что есть это в examples, demos


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: Dendy от Февраля 03, 2009, 23:29
Хмм, а вот это зря... :-\ Получается я должен вручную и в хедере и в .cpp-файле функции добавлять...

Если вы говорите "зря", значит или не до конца поняли идею или у вас переходный период с других визуальных средств программирования. Есть идея, что вспомогательные программы не должны править код. Так как это сопровождается испохабиванием того что пишет программист. Ни одна вспомогательная программа не сможет правильно вставить обьявления методов, сохранить форматирование и так далее. Кроме того есть риск случайной вставки, удаления или порчи такого кода когда программа полезет его править за вас.

В общем, код или на 100% пишется программистом или на 100% генерируется промежуточной утилитой.


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: lit-uriy от Февраля 04, 2009, 00:17
Набор иконок можно посмотреть тут: %QTDIR%\tools\designer\src\components\formeditor\images\
здесь их пожалуй больше чем в других каталогах


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: koe-kto от Февраля 04, 2009, 15:40
Есть идея, что вспомогательные программы не должны править код.
Есть идея, что нудные повторяющиеся действия которые могут быть автоматизированы - должны быть автоматизированы :)
Что вполне успешно реализовано в тех же Delphi и MSVS/.NET и т.д. Я конечно понимаю, что не всем нравится как оно там реализовано... (и что С++ и всякие Delphi - не совсем одно и тоже) ;)
Цитировать
Ни одна вспомогательная программа не сможет правильно вставить обьявления методов, сохранить форматирование и так далее.
Ну это мягко говоря неправда, особенно про форматирование.
А вообще ИМХО здесь даже проблема не в том, должно ли что-то лезть в писаный человеком код, а в том, почему описание графического интерфейса вдруг оказывается "кодом" а не "данными"... Но это уже не в тему :)

По теме - я вдруг понял "что делать и с чего начать", когда прочитал про auto-connection - вот это было на редкость неочевидно :o Забавно опять же, что вещи которые я ожидал что за меня сделает Qt Designer пришлось делать вручную, и наоборот - то что обычно делается вручную за меня сделало Qt :-\


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: Rcus от Февраля 04, 2009, 16:02
.ui файл это данные, а вот результат работы uic это уже код. Можно их грузить и напрямую ala .dfm, но все же это нужно не так часто.
autoconnect и плагин для IDE рулит (например для Eclipse/CDT есть плагин рефакторинга позволяющий в том числе генерировать пустые тела методов в cpp файле по объявлениям)


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: panAlexey от Февраля 04, 2009, 16:14
Забавно опять же, что вещи которые я ожидал что за меня сделает Qt Designer пришлось делать вручную, и наоборот - то что обычно делается вручную за меня сделало Qt :-\
Знаешь, попытки влезть со своим уставом в чужие монастыри редко заканчиваются так мирно как у тебя.
Ты осознаешь наконец, что Qt - это с++ со всеми его достоинствами и недостатками или так и будешь пытаться работать с библиотекой как будто это конструктор для чайников?


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: koe-kto от Февраля 04, 2009, 17:54
Ты осознаешь наконец, что Qt - это с++ со всеми его достоинствами и недостатками
Я осознаю, что Qt - это уже не совсем C++ :)


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: koe-kto от Февраля 18, 2009, 19:43
Хмм, а вот это зря... :-\ Получается я должен вручную и в хедере и в .cpp-файле функции добавлять...

Если вы говорите "зря", значит или не до конца поняли идею ...
Как говорится "время рассудит" - вот и рассудило, в новой версии Qt Creator'a появилась команда "Go to slot..." добавляющая слоты "за меня" :)


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: Dendy от Февраля 18, 2009, 21:49
Главное этим не увлекаться. Вот чесное слово, я бы не доверил сторонней утилите ковырять мои исходники. Куда именно в заголовочник она вставит обьявление метода, какое будет форматирование отступов, с каким квалификатором (private/protected/public) оно его вставит, какие будут имена аргументов? Это первое что приходит на ум. А в какой именно исходный файл оно вставит определение метода, если он у меня разнесён на несколько файлов? А может я вообще хотел слот сделать инлайновым. И опять же форматирование, именование переменных - нужно проверять в двух местах. Сколько отступов строк от верхнего и нижнего метода оно мне сделает, между какими методами оно вообще мне его вставит? А что будет если я случайно клацнул перейти не к тому слоту - я ведь захочу его удалить, вот только смогу ли я сделать это с помощью той же стороней утилиты, чтобы она случайно не удалила то что не нужно, или наоборот, удалила не всё? Что будет, если я захочу добавить или удалить параметр из слота или вообще изменить сигнатуру сигнала - прийдётся ведь всё равно править руками код, здесь никакие автоматизаторы не помогут.

В каждом классе пишется множество методов, стоит ли мучиться всеми этими вопросами ради того чтобы написать ещё один метод руками?


Название: Re: SDI приложение, хочу рисовать в окне, не пойму, что делть и с чего начать
Отправлено: koe-kto от Февраля 19, 2009, 14:10
Согласен, но для Qt-чайника (в моем лице) такая помощь совсем не лишняя.

Насчет форматирования это все в современных IDE легко решается, а вот это
каким квалификатором (private/protected/public) оно его вставит
действительно интересный вопрос :)