Я пытаюсь создать простое приложение для рисования - его просто нужно нарисовать, когда вы нажимаете и перетаскиваете курсор (как и Paint). Я знаю, что мне нужно использовать QPainter
, но как я могу его обработать? Как это сделать? Любая помощь могла бы быть полезна. Я пробовал скрываться через интернет, но не нашел слишком много информации (я делаю рисование строк и т. Д. Кодом, который запускает приложение, и он здесь, но я не могу найти пример рисования чего-либо пользователем).Как нарисовать, удерживая нажатой кнопку мыши?
0
A
ответ
2
Это довольно широкий вопрос, но вот основы:
- Сделайте подкласс
QWidget
класса, так что вы можете изменить некоторые из своих виртуальных методов позже. - Создайте объект вашего подкласса и позвоните по телефону
show()
(непосредственно перед вызовомQApplication::exec()
). Этот объект будет отображаться на экране как очень простое окно, и оно будет служить вашей живописной поверхностью вашего пользователя. - Создайте объект
QPixmap
, который вы будете использовать для сохранения растрового изображения, которое будет рисовать пользователь. Убедитесь, что размерQPixmap
не меньше максимального размера окна, которое вы хотите поддерживать. Заполнитеfill()
на номерQPixmap
, чтобы заполнить его с любимым цветом фона. - Переопределения
mousePressEvent(QMouseEvent *)
метода вашего объекта, чтобы установить логический флаг is_mouse_down, а также для записи текущего положения указателя мыши в окне (по телефонуpos()
наQMouseEvent
объекте, который получает передаваемый вmousePressEvent()
вызова и хранении, что в переменную-член вашего объекта). - Переопределить метод
mouseMoveEvent(QMouseEvent *)
так, что еслиis_mouse_down_is
набор дляtrue
, он создаетQPainter
объект на стеке - передать указатель наQPixmap
конструкторуQPainter
объекта так, чтоQPainter
привлечет в вашQPixmap
объект. Затем вызовитеdrawLine()
на объектQPainter
, чтобы нарисовать линию от предыдущей позиции мыши до текущей. Наконец, позвонитеupdate()
, чтобы сообщить Qt, чтобы позвонитьpaintEvent()
для вас как можно скорее. - Переопределить метод
mouseReleaseEvent(QMouseEvent *)
установитьis_mouse_down
к ложным снова - Override метод
paintEvent(QPaintEvent *)
создатьQPainter
объект на стеке - передать указатель на (this
) конструкторуQPainter
объекта, так что он будет рисовать наQWidget
напрямую. Затем вызовите drawPixmap() на объектQPainter
, чтобы он нарисовал объектQPixmap
на видимой поверхности виджета.
Если вы хотите увидеть предварительно написанный пример, ознакомьтесь с приложением Scribble, включенным в Qt, в $QTDIR/examples/widgets/widgets/scribble
.
3
Вот ответ Джереми в коде вместо прозы:
// https://github.com/KubaO/stackoverflown/tree/master/questions/simplepaint-39358392
#include <QtWidgets>
// Make a subclass of the QWidget class, so that you can override some of its
// virtual methods
class PaintWidget : public QWidget {
// Create a QPixmap object that you will use to store the bitmap
// that the user will draw [on].
QPixmap m_pixmap;
QPoint m_lastPos;
// Override the paintEvent(QPaintEvent *) [...]
void paintEvent(QPaintEvent *) override {
QPainter painter{this};
painter.drawPixmap(0, 0, m_pixmap);
}
void resizeEvent(QResizeEvent *) override {
// [...] size the QPixmap to be at least as big as the maximum size of the window
// We'll also never let it shrink so as not to lose the already drawn image.
auto newRect = m_pixmap.rect().united(rect());
if (newRect == m_pixmap.rect()) return;
QPixmap newPixmap{newRect.size()};
QPainter painter{&newPixmap};
painter.fillRect(newPixmap.rect(), Qt::white);
painter.drawPixmap(0, 0, m_pixmap);
m_pixmap = newPixmap;
}
// Override the mousePressEvent(QMouseEvent *) [...]
void mousePressEvent(QMouseEvent * ev) override {
m_lastPos = ev->pos();
draw(ev->pos());
}
// Override the mouseMoveEvent(QMouseEvent *) [...]
void mouseMoveEvent(QMouseEvent * ev) override {
draw(ev->pos());
}
void draw(const QPoint & pos) {
QPainter painter{&m_pixmap};
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen({Qt::blue, 2.0});
painter.drawLine(m_lastPos, pos);
m_lastPos = pos;
update();
}
public:
using QWidget::QWidget;
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
// Create an object of your subclass and call show()
PaintWidget ui;
ui.show();
return app.exec();
}
Не нужно переопределить mouseReleaseEvent
. В виджета поведение по умолчанию - отслеживать движение мыши только при нажатии кнопки мыши. mouseMoveEvent
не будет вызываться, если не нажата кнопка.
+0
Спасибо, я уже создал и создал свою «простую краску». Цените это, хотя. – MindRoller
Смежные вопросы
- 1. Удерживая нажатой левую кнопку мыши в AutoHotkey
- 2. Сменить фотографию, удерживая нажатой кнопку
- 3. Удерживая кнопку нажатой, используя сеансы в JSP
- 4. Сделайте что-нибудь, удерживая нажатой кнопку.
- 5. LWJGL удерживая нажатой клавишу
- 6. Swift: как поэтапно изменить размер UIView, удерживая нажатой кнопку
- 7. Рисунок SDL/C++, удерживая кнопку мыши
- 8. Удерживая кнопку нажатой, когда другие кнопки не нажаты
- 9. Удерживая нажатой кнопку мыши на заголовке SlickGrid, чтобы получить информацию о столбце
- 10. Fabric.js - элемент не определен, когда я двигаю мышь, удерживая нажатой кнопку мыши
- 11. не удается найти элементы подменю, не удерживая нажатой кнопку мыши в приложении Angularjs
- 12. Нажмите и удерживайте нажатой кнопку мыши или щелкнув мышью
- 13. Не оставляйте нажатой левую кнопку мыши.
- 14. Robot - AutoClicking, удерживая нажатой левый клик
- 15. Как нажимать кнопку нажатой
- 16. Как сделать кнопку нажатой?
- 17. Попытка переместить кнопки, удерживая кнопку мыши и передвигая
- 18. Перемещение DIV несколько раз, нажав и удерживая кнопку мыши
- 19. Удерживая событие мыши в WPF
- 20. Rate ограничить функцию, удерживая кнопку,
- 21. Удерживая кнопку + нажатие другого макроса
- 22. Matlab: Кнопка обратного вызова для «Удерживая нажатой клавишу» событие
- 23. Удерживая кнопку (div) в центре
- 24. Поймать кнопку мыши нажатой кнопкой из всплывающего меню qComboBox
- 25. Как сделать кнопку iPhone нажатой?
- 26. Как нарисовать кнопкой мыши
- 27. Зарегистрировать первую кнопку нажатой.
- 28. Как заставить JButton выполнить, удерживая кнопку?
- 29. Looping что-то, удерживая мышь
- 30. Обнаружение мыши, нажатой на GUI
Большое спасибо! Мне действительно удалось сделать что-то вроде этого: он рисовал один пиксель, и этот пиксель исчезал каждый раз.Теперь я знаю, почему и как это делать правильно. Спасибо за ваше время!! – MindRoller