Скачал SDK, решил изучить... Правда не совсем понятно с виджетом QGraphicsView. Как на нем нарисовать линию, фигуру, сделать заливку? Просьба не отсылать к официальному руководству, ковыряюсь в нем, но пока не все понятно...
В общем создал я слот для кнопки и в него прописал код:
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
что это значит?
... теперь напишу, что я хотел от тебя услышат, причем на русском языке:
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
теперь, когда появляется форма на ней уже отрисован овал. Но мне нужно вывести рисунок на какое нибудь полотно (например QGraphicsView) при нажатии на кнопку. Как это сделать? Как передвигать этот овал по форме (с помощью цикла)
Выводить рисунок? =) Переопределяешь paintEvent нужного виджета, получаешь ссылку на QPainter, подгружаешь картинку и методом drawPixmap класса QPainter рисуешь.
Если быть точнее:
если хочешь рисовать на QGraphicView, то ты создаешь новый класс, наследуемый от QGraphicView, переопределяешь в нем paintEvent. Там получаешь, как я уже говорил, QPainter painter = QPainter(this); // Или как-то так, давно на с++ программировал =)
QPixamp yourImage = QPixmap("PathToImg");
На счет передвигания овала... Здесь нужно делать так: опять переопределяем событие paintEvent, нужно создать массив координат твоего овала, в котором будешь хранить текущие. По этому массиву получаешь координаты, очищаешь форму, рисуешь заново овал (по новым координатам). А таскать: переопределяешь mouseMoveEvent, mouseClickEvent. И просчитываешь координаты изменения.
Вот только на счет передвижения. Мне нужно это в цикле сделать. Вот paintEvent когда срабатывает? Мне нужно внутри организовать цикл? Или цикл должен быть внешний? Тогда как передать в paintEvent пересчитанные в цикле координаты?
А как еще двигать его автоматически? Посчитал координаты, следующая итерация, посчитал новые...
Тем более, если я смогу работать с циклом, то я научусь использовать метод где угодно...
Вы переопределяете события движения и нажатия мыши, там вычисляете новые координаты, добавляете их в какой-то глобальный массив. А в paintEvent просто обрабатываете массив. По-идее, после нажатия окно должно перерисоваться. Если что, потом нужно будет "силой" заставлять виджет перерисоваться.
Скачал с офф.сайта 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
Поспешил задавать вопрос...Переведя эту фразу худо-бедно понял суть. Как только он скачался я переместил его в другую папку, оттуда он такое и выдавал. Переместил обратно в папку куда он качался и установка пошла
Выдает ошибку: /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&)
graphics.h с 12 по 16 class PaintField : public QGraphicsView { public: void paintEvent(QPaintEvent *); };
graphics.cpp с 4 по 10 это конструктор. См. выше
А есди наследовать мой конструктор от конструктора QWidget? Или родительский конструктор должен обязательно принадлежать родительскому классу?
Блин, нигде не могу найти в документации ни про наследование виджетов, ни про создание собственных виджетов...
Решил по изучать программирование на 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.
Не могу разобраться, нашел где указать, но его ничего не устраивает почему-то
Создал свой первый проект в QT Creator. На форму бросил бутон и лэйбл. При нажатии на бутон вывожу любой текст. Теперь проблема с выводом переменной. void MainWindow::on_pushButton_clicked() { int i = 10; if(i == 10) { ui->label->setText("variable is ", inttostr(i)); } }
Я, дурак, 5 лет программил под винду на делфи... там чтобы преобразовать переменную в строку были функции IntToStr, FloatToStr и т.п.. а тут как? Где эти функции ? нужно добавить какой-то модуль в include ?
Это снова я. Примеры, которые идут с qt-creator компилятся у меня только если запускаю creator из под рута. Скажите пожалуйста что я делаю не так? Может в какую-то группу надо добавить себя? Или разрешения на папки с премерами менять?
путь /usr/share как бе намекает, что ты пытаешься менять файлы, которые принадлежат root. или скопирую себе в home папку с экземплами и собирай там, или скачай qt-sdk с офф. сайта - там всё в комплекте и ставится целиком в /home.
Почему же на первой же странице программы в списке экзамплов ссылки именно на этот путь? Что изначально так задумано, что Creator будет запускаться из под рута?
Ёперный театр!!!!! Ребята, а вы видали какая красотища в демках у QT лежит??
Вот эта вообще супер!! /usr/lib/qt4/demos/boxes/.. Я влюбляюсь в QT не на шутку
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
что это значит?
... теперь напишу, что я хотел от тебя услышат, причем на русском языке:
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
Как оказалось рисовать нужно в событии 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) при нажатии на кнопку. Как это сделать? Как передвигать этот овал по форме (с помощью цикла)
Выводить рисунок? =) Переопределяешь paintEvent нужного виджета, получаешь ссылку на QPainter, подгружаешь картинку и методом drawPixmap класса QPainter рисуешь.
Если быть точнее:
если хочешь рисовать на QGraphicView, то ты создаешь новый класс, наследуемый от QGraphicView, переопределяешь в нем paintEvent. Там получаешь, как я уже говорил, QPainter painter = QPainter(this); // Или как-то так, давно на с++ программировал =)
QPixamp yourImage = QPixmap("PathToImg");
painter.drawPixmap(yourImage);
На счет передвигания овала... Здесь нужно делать так: опять переопределяем событие paintEvent, нужно создать массив координат твоего овала, в котором будешь хранить текущие. По этому массиву получаешь координаты, очищаешь форму, рисуешь заново овал (по новым координатам). А таскать: переопределяешь mouseMoveEvent, mouseClickEvent. И просчитываешь координаты изменения.
Спасибо за помощь :)
Вот только на счет передвижения. Мне нужно это в цикле сделать. Вот paintEvent когда срабатывает? Мне нужно внутри организовать цикл? Или цикл должен быть внешний? Тогда как передать в paintEvent пересчитанные в цикле координаты?
А зачем вам цикл? Можете объяснить суть? =)
А как еще двигать его автоматически? Посчитал координаты, следующая итерация, посчитал новые...
Тем более, если я смогу работать с циклом, то я научусь использовать метод где угодно...
Вы переопределяете события движения и нажатия мыши, там вычисляете новые координаты, добавляете их в какой-то глобальный массив. А в paintEvent просто обрабатываете массив. По-идее, после нажатия окно должно перерисоваться. Если что, потом нужно будет "силой" заставлять виджет перерисоваться.
нужно будет, методом update();
Проблема с установкой 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
А попробуй проверить md5-сумму образа.
Поспешил задавать вопрос...Переведя эту фразу худо-бедно понял суть. Как только он скачался я переместил его в другую папку, оттуда он такое и выдавал. Переместил обратно в папку куда он качался и установка пошла
Создал новый класс:
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();
}
Как теперь создать объект этого метода и сделать его видимым на форме?
PaintField localWidget = PaintField(this); // this = parent
localWidget.show();
Мммм, это где прописать? В конструкторе GraphicsView? 0_o Или в конструкторе MainWindow?
Упс, туплю
В MainWindow, ссылку на него и передаете (this). Он будет выступать в качестве родителя.
Мда, давненько я на 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&)
Да я тоже давно на с++ и Qt программировал... Вот сейчас просто на PyQt работаю... вот Немного и знаю =). Покажи 8 и 13 строки.
graphics.h с 12 по 16
class PaintField : public QGraphicsView
{
public:
void paintEvent(QPaintEvent *);
};
graphics.cpp с 4 по 10 это конструктор. См. выше
Попробуйте что-то типа:
this->field = PaintField(parent);
/home/robotex/workspace/graphics/graphics.cpp:8: error: no matching function for call to ‘PaintField::PaintField(QWidget*&)’
Хм, там вроде еще конструктор нужно переопределить. Кто нибудь знает как?
Ну и как перемещать этот элиипс по форме? При нажатии на кнопку смещать на 10 пикселей вниз
Вам надо вызвать конструктор QWidget в конструкторе своего объекта. Что-то типа: QWidget::QWidget(parent);
А есди наследовать мой конструктор от конструктора QWidget? Или родительский конструктор должен обязательно принадлежать родительскому классу?
Блин, нигде не могу найти в документации ни про наследование виджетов, ни про создание собственных виджетов...
Че-то тут разговор не про qt creator, а про программирование на ктуэ. Аффтар, почитай книжку по кутэ, это будет рациональнее.
Решил по изучать программирование на 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.
Не могу разобраться, нашел где указать, но его ничего не устраивает почему-то
У меня автоматически настроилось:
Хм...только сейчас заметил. У меня говорит, что Qt4 не установлен. Я наивно думал, что в kde его не надо ставить
Наверное, заголовочных файлов не хватает. Вроде пакет называется qt4-dev-tools или как-то так.
Soi-Fong спасибо, помогло
Посоветуйте литературу по данной теме...
В своё время писал на борланд ц++, а сейчас, похоже, пришло время программирования под линух...
На кутэ хоть под макось или симбиан пиши.
Книжка, например, вот: Жасмин Бланшет, Марк Саммерфилд. Qt4: Программирование GUI на C++, с архивом примеров, которые я выпросил у какого-то чувака на канале с++ руснета ))
Архив не открывается... arch показывает, что архив пустой...
Арк - ужасный архиватор. Я перезалил, попробуй теперь.
Спасибо!
То, что доктор прописал!
Все работает, спасибо... А арк хорош...
Создал свой первый проект в QT Creator. На форму бросил бутон и лэйбл. При нажатии на бутон вывожу любой текст. Теперь проблема с выводом переменной.
void MainWindow::on_pushButton_clicked()
{
int i = 10;
if(i == 10)
{
ui->label->setText("variable is ", inttostr(i));
}
}
Я, дурак, 5 лет программил под винду на делфи... там чтобы преобразовать переменную в строку были функции IntToStr, FloatToStr и т.п.. а тут как? Где эти функции ? нужно добавить какой-то модуль в include ?
см. документацию про 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);
}
спасибо, добрый человек!!! Это работает :)
Это снова я. Примеры, которые идут с qt-creator компилятся у меня только если запускаю creator из под рута. Скажите пожалуйста что я делаю не так? Может в какую-то группу надо добавить себя? Или разрешения на папки с премерами менять?
дык а что пишет-то?
путь /usr/share как бе намекает, что ты пытаешься менять файлы, которые принадлежат root. или скопирую себе в home папку с экземплами и собирай там, или скачай qt-sdk с офф. сайта - там всё в комплекте и ставится целиком в /home.
Почему же на первой же странице программы в списке экзамплов ссылки именно на этот путь? Что изначально так задумано, что Creator будет запускаться из под рута?
изначально задумано, что ты скачаешь sdk с офф. сайта и поставишь его в home.
Ёперный театр!!!!! Ребята, а вы видали какая красотища в демках у QT лежит??
Вот эта вообще супер!! /usr/lib/qt4/demos/boxes/.. Я влюбляюсь в QT не на шутку
Отправить комментарий