QT Creator

Скачал SDK, решил изучить... Правда не совсем понятно с виджетом QGraphicsView. Как на нем нарисовать линию, фигуру, сделать заливку? Просьба не отсылать к официальному руководству, ковыряюсь в нем, но пока не все понятно...

0
Robotex - 20 Март, 2009 - 01:35

http://www.qtsoftware.com/downloads QT Creator IDE

В общем создал я слот для кнопки и в него прописал код:

    QPainter painter(ui->graphicsView);
    painter.setPen(QPen(Qt::black, 3, Qt::DashDotLine));
    painter.setBrush(QBrush(Qt::red, Qt::SolidPattern));
    painter.drawEllipse(20, 20, 100, 60);

вот только при нажатии на кнопку выдается:
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active

что это значит?

0
balamutick - 20 Март, 2009 - 01:45
Изображение пользователя balamutick.

... теперь напишу, что я хотел от тебя услышат, причем на русском языке:

Qt (произносится «кьют») — кросс-платформенный инструментарий разработки ПО на языке программирования C++. Есть также «привязки» ко многим другим языкам программирования: Python — PyQt, Ruby — QtRuby, Java — Qt Jambi, PHP — PHP-Qt и другие.

Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.

Существуют версии библиотеки для Microsoft Windows, систем класса UNIX с графической подсистемой X11, Mac OS X, Microsoft Windows CE, встраиваемых Linux-систем и платформы S60.

До недавнего времени библиотека Qt также распространялась ещё в одной версии: Qt/Embedded. Теперь эта платформа переименована в Qtopia Core и распространяется как отдельный продукт. Qtopia Core обеспечивает базовую функциональность для всей линейки платформ, предназначенных для разработки приложений для встраиваемых и мобильных устройств (КПК, смартфонов и т. п.).

***
Вообщем, очень современный и прогрессивный инструмент программирования(разработки).
Русскоязычный форум по Qt

0
Robotex - 20 Март, 2009 - 02:03

Как оказалось рисовать нужно в событии paintEvent

Сделал так:
void Graphics::paintEvent(QPaintEvent *)
{
    QPainter painter;
    painter.begin(this);
    painter.setPen(QPen(Qt::black, 3, Qt::DashDotLine));
    painter.setBrush(QBrush(Qt::red, Qt::SolidPattern));
    painter.drawEllipse(120,120, 100, 60);
    painter.end();
}

теперь, когда появляется форма на ней уже отрисован овал. Но мне нужно вывести рисунок на какое нибудь полотно (например QGraphicsView) при нажатии на кнопку. Как это сделать? Как передвигать этот овал по форме (с помощью цикла)

0
Ockonal - 20 Март, 2009 - 11:16
Изображение пользователя Ockonal.

Выводить рисунок? =) Переопределяешь paintEvent нужного виджета, получаешь ссылку на QPainter, подгружаешь картинку и методом drawPixmap класса QPainter рисуешь.

0
Ockonal - 20 Март, 2009 - 11:18
Изображение пользователя Ockonal.

Если быть точнее:
если хочешь рисовать на QGraphicView, то ты создаешь новый класс, наследуемый от QGraphicView, переопределяешь в нем paintEvent. Там получаешь, как я уже говорил, QPainter painter = QPainter(this); // Или как-то так, давно на с++ программировал =)
QPixamp yourImage = QPixmap("PathToImg");

painter.drawPixmap(yourImage);

0
Ockonal - 20 Март, 2009 - 11:21
Изображение пользователя Ockonal.

На счет передвигания овала... Здесь нужно делать так: опять переопределяем событие paintEvent, нужно создать массив координат твоего овала, в котором будешь хранить текущие. По этому массиву получаешь координаты, очищаешь форму, рисуешь заново овал (по новым координатам). А таскать: переопределяешь mouseMoveEvent, mouseClickEvent. И просчитываешь координаты изменения.

0
Robotex - 20 Март, 2009 - 13:44

Спасибо за помощь :)

Вот только на счет передвижения. Мне нужно это в цикле сделать. Вот paintEvent когда срабатывает? Мне нужно внутри организовать цикл? Или цикл должен быть внешний? Тогда как передать в paintEvent пересчитанные в цикле координаты?

0
Ockonal - 20 Март, 2009 - 13:55
Изображение пользователя Ockonal.

А зачем вам цикл? Можете объяснить суть? =)

0
Robotex - 20 Март, 2009 - 22:42

А как еще двигать его автоматически? Посчитал координаты, следующая итерация, посчитал новые...
Тем более, если я смогу работать с циклом, то я научусь использовать метод где угодно...

0
Ockonal - 20 Март, 2009 - 23:06
Изображение пользователя Ockonal.

Вы переопределяете события движения и нажатия мыши, там вычисляете новые координаты, добавляете их в какой-то глобальный массив. А в paintEvent просто обрабатываете массив. По-идее, после нажатия окно должно перерисоваться. Если что, потом нужно будет "силой" заставлять виджет перерисоваться.

0
Soi-Fong - 20 Март, 2009 - 23:44
Изображение пользователя Soi-Fong.

нужно будет, методом update();

0
Lang - 20 Март, 2009 - 20:43
Изображение пользователя Lang.

Проблема с установкой QT Creator

Скачал с офф.сайта qt-sdk-linux-x86-opensource-2009.01.bin.
Далее как там написано сделал его исполнительным
sudo chmod u+x qt-sdk-linux-x86-opensource-2009.01.bin
Потом начал ставить его из домашней папки
./qt-sdk-linux-x86-opensource-2009.01.bin делал и с sudo
А он выдает
Installer payload initialization failed. This is likely due to an incomplete or corrupt downloaded file.
Кто его ставил, что я сделал не так? Дистрибутив 9.04

0
Ockonal - 20 Март, 2009 - 20:51
Изображение пользователя Ockonal.

А попробуй проверить md5-сумму образа.

0
Lang - 20 Март, 2009 - 20:52
Изображение пользователя Lang.

Поспешил задавать вопрос...Переведя эту фразу худо-бедно понял суть. Как только он скачался я переместил его в другую папку, оттуда он такое и выдавал. Переместил обратно в папку куда он качался и установка пошла

0
Robotex - 20 Март, 2009 - 22:55

Создал новый класс:

class PaintField : public QGraphicsView
{
    public:
        void paintEvent(QPaintEvent *);
};

Переопределил метод

void PaintField::paintEvent(QPaintEvent *)
{
    QPainter painter;
    painter.begin(this);
    painter.setPen(QPen(Qt::black, 3, Qt::DashDotLine));
    painter.setBrush(QBrush(Qt::red, Qt::SolidPattern));
    painter.drawEllipse(40,40, 100, 100);
    painter.end();
}

Как теперь создать объект этого метода и сделать его видимым на форме?

0
Ockonal - 20 Март, 2009 - 23:04
Изображение пользователя Ockonal.

PaintField localWidget = PaintField(this); // this = parent
localWidget.show();

0
Robotex - 20 Март, 2009 - 23:18

Мммм, это где прописать? В конструкторе GraphicsView? 0_o Или в конструкторе MainWindow?

Упс, туплю

0
Ockonal - 20 Март, 2009 - 23:21
Изображение пользователя Ockonal.

В MainWindow, ссылку на него и передаете (this). Он будет выступать в качестве родителя.

0
Robotex - 20 Март, 2009 - 23:29

Мда, давненько я на C++ не писал...

По прежнему не получается ))
class Graphics : public QMainWindow
{
    Q_OBJECT

    private slots:
        void click();

    public:
        Graphics(QWidget *parent = 0);
        void paintEvent(QPaintEvent *);
        ~Graphics();
        PaintField field;

    private:
        Ui::GraphicsClass *ui;
};

Конструктор:
Graphics::Graphics(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::GraphicsClass)
{
    ui->setupUi(this);
    this->field = PaintField(this);
    this->field.show();
}

Выдает ошибку:
/home/robotex/workspace/graphics/graphics.cpp:8: error: no matching function for call to ‘PaintField::PaintField(Graphics* const)’
/home/robotex/workspace/graphics/graphics.h:13: note: candidates are: PaintField::PaintField(const PaintField&)

0
Ockonal - 20 Март, 2009 - 23:36
Изображение пользователя Ockonal.

Да я тоже давно на с++ и Qt программировал... Вот сейчас просто на PyQt работаю... вот Немного и знаю =). Покажи 8 и 13 строки.

0
Robotex - 20 Март, 2009 - 23:55

graphics.h с 12 по 16
class PaintField : public QGraphicsView
{
    public:
        void paintEvent(QPaintEvent *);
};

graphics.cpp с 4 по 10 это конструктор. См. выше

0
Ockonal - 21 Март, 2009 - 00:18
Изображение пользователя Ockonal.

Попробуйте что-то типа:
this->field = PaintField(parent);

0
Robotex - 21 Март, 2009 - 00:24

/home/robotex/workspace/graphics/graphics.cpp:8: error: no matching function for call to ‘PaintField::PaintField(QWidget*&)’

0
Robotex - 21 Март, 2009 - 01:23

Хм, там вроде еще конструктор нужно переопределить. Кто нибудь знает как?

Ну и как перемещать этот элиипс по форме? При нажатии на кнопку смещать на 10 пикселей вниз

0
Ockonal - 21 Март, 2009 - 09:18
Изображение пользователя Ockonal.

Вам надо вызвать конструктор QWidget в конструкторе своего объекта. Что-то типа: QWidget::QWidget(parent);

0
Гость - 21 Март, 2009 - 10:04

А есди наследовать мой конструктор от конструктора QWidget? Или родительский конструктор должен обязательно принадлежать родительскому классу?
Блин, нигде не могу найти в документации ни про наследование виджетов, ни про создание собственных виджетов...

0
Soi-Fong - 21 Март, 2009 - 18:30
Изображение пользователя Soi-Fong.

Че-то тут разговор не про qt creator, а про программирование на ктуэ. Аффтар, почитай книжку по кутэ, это будет рациональнее.

0
Lang - 22 Март, 2009 - 15:35
Изображение пользователя Lang.

Решил по изучать программирование на Qt4. Прикупил себе толстенную книженцию - Макс Шлее "Qt4. Профессиональное программирование на C++". Установил себе Qt Creator, но никак не получается собрать простенький пример "Hello, World !"
При компиляции ругается вроде на то, что не указана Qt версия. Вообщем вот
Running build steps for project Hello...
Creating gdb macros library...
No valid Qt version set. Set one in Tools/Options
Error while building project Hello
When executing build step 'QMake'
Canceled build.

Не могу разобраться, нашел где указать, но его ничего не устраивает почему-то

0
Soi-Fong - 22 Март, 2009 - 15:51
Изображение пользователя Soi-Fong.

У меня автоматически настроилось:

0
Lang - 22 Март, 2009 - 16:08
Изображение пользователя Lang.

Хм...только сейчас заметил. У меня говорит, что Qt4 не установлен. Я наивно думал, что в kde его не надо ставить

+1
Soi-Fong - 22 Март, 2009 - 17:41
Изображение пользователя Soi-Fong.

Наверное, заголовочных файлов не хватает. Вроде пакет называется qt4-dev-tools или как-то так.

0
Lang - 22 Март, 2009 - 21:01
Изображение пользователя Lang.

Soi-Fong спасибо, помогло

0
Condor - 23 Март, 2009 - 14:29
Изображение пользователя Condor.

Посоветуйте литературу по данной теме...
В своё время писал на борланд ц++, а сейчас, похоже, пришло время программирования под линух...

+1
Soi-Fong - 23 Март, 2009 - 14:51
Изображение пользователя Soi-Fong.

На кутэ хоть под макось или симбиан пиши.
Книжка, например, вот: Жасмин Бланшет, Марк Саммерфилд. Qt4: Программирование GUI на C++, с архивом примеров, которые я выпросил у какого-то чувака на канале с++ руснета ))

0
Robotex - 24 Март, 2009 - 19:25

Архив не открывается... arch показывает, что архив пустой...

0
Soi-Fong - 24 Март, 2009 - 20:12
Изображение пользователя Soi-Fong.

Арк - ужасный архиватор. Я перезалил, попробуй теперь.

0
Condor - 25 Март, 2009 - 16:29
Изображение пользователя Condor.

Спасибо!
То, что доктор прописал!

0
Robotex - 25 Март, 2009 - 01:05

Все работает, спасибо... А арк хорош...

0
vimax - 2 Октябрь, 2009 - 20:19
Изображение пользователя vimax.

Создал свой первый проект в QT Creator. На форму бросил бутон и лэйбл. При нажатии на бутон вывожу любой текст. Теперь проблема с выводом переменной.
void MainWindow::on_pushButton_clicked()
{
int i = 10;
if(i == 10)
{
     ui->label->setText("variable is ", inttostr(i));
}
}

Я, дурак, 5 лет программил под винду на делфи... там чтобы преобразовать переменную в строку были функции IntToStr, FloatToStr и т.п.. а тут как? Где эти функции ? нужно добавить какой-то модуль в include ?

0
bahus - 2 Октябрь, 2009 - 23:04

см. документацию про QString.

Там есть функция QString::number(int n, int base = 10)

а вобще по простому можно записать так:

void MainWindow::on_pushButton_clicked()
{
   QString txt = "variable is: ";

   txt.append(QString::number(10));
   ui->label->setText(txt);
}

0
vimax - 3 Октябрь, 2009 - 10:29
Изображение пользователя vimax.

спасибо, добрый человек!!! Это работает :)

0
vimax - 9 Декабрь, 2009 - 18:32
Изображение пользователя vimax.

Это снова я. Примеры, которые идут с qt-creator компилятся у меня только если запускаю creator из под рута. Скажите пожалуйста что я делаю не так? Может в какую-то группу надо добавить себя? Или разрешения на папки с премерами менять?

0
ktchv - 9 Декабрь, 2009 - 19:37
Изображение пользователя ktchv.

дык а что пишет-то?

0
vimax - 9 Декабрь, 2009 - 19:56
Изображение пользователя vimax.
  • Выполняется сборка проекта map...
  • Запускается: /usr/bin/qmake-qt4 /usr/lib/qt4/examples/qtconcurrent/map/map.pro -spec /usr/share/qt4/mkspecs/linux-g++ -r CONFIG+=debug
  • Failure to open file: /usr/lib/qt4/examples/qtconcurrent/map/Makefile
  • Unable to generate makefile for: /usr/lib/qt4/examples/qtconcurrent/map/map.pro
  • Завершено с кодом возврата 5.
  • Ошибка во время сборки проекта map
  • Во время выполнения сборки на этапе 'QMake'
0
ktchv - 9 Декабрь, 2009 - 21:35
Изображение пользователя ktchv.

путь /usr/share как бе намекает, что ты пытаешься менять файлы, которые принадлежат root. или скопирую себе в home папку с экземплами и собирай там, или скачай qt-sdk с офф. сайта - там всё в комплекте и ставится целиком в /home.

0
vimax - 9 Декабрь, 2009 - 22:46
Изображение пользователя vimax.

Почему же на первой же странице программы в списке экзамплов ссылки именно на этот путь? Что изначально так задумано, что Creator будет запускаться из под рута?

0
ktchv - 10 Декабрь, 2009 - 11:30
Изображение пользователя ktchv.

изначально задумано, что ты скачаешь sdk с офф. сайта и поставишь его в home.

0
vimax - 9 Декабрь, 2009 - 20:00
Изображение пользователя vimax.

Ёперный театр!!!!! Ребята, а вы видали какая красотища в демках у QT лежит??
Вот эта вообще супер!! /usr/lib/qt4/demos/boxes/.. Я влюбляюсь в QT не на шутку

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры