Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2021, 12:41   #1
KoTTeLLo
Новичок
Джуниор
 
Регистрация: 05.12.2021
Сообщений: 1
По умолчанию Работа с классами QPaintEvent и QMouseEvent

Нужно создать приложение, которое позволяет рисовать закрашенные прямоугольники с помощью мыши. Создаваемый прямоугольник должен быть видим в процессе построения. Я новичок в QT. Я делаю это с помощью классов QPaintEvent и QMouseEvent. По идее, чтобы рисовать прямоугольник с помощью drawRect мне нужны координаты точки центра, а также ширина и высота. Я понимаю, что центр надо получить вроде как из MousePressEvent, но как это сделать я не знаю. Ширина и высота, наверно, получаются из MouseMoveEvent, но опять же как их получить я не знаю.
Вот, что я смог написать, но работает оно ужасно, и рисует как бы линии из прямоугольников.

Код:
//paintwidget.h
#ifndef PAINTWIDGET_H
#define PAINTWIDGET_H

#include <QMainWindow>
#include <QPainter>

QT_BEGIN_NAMESPACE
namespace Ui { class PaintWidget; }
QT_END_NAMESPACE

class PaintWidget : public QMainWindow
{
    Q_OBJECT

public:
    PaintWidget(QWidget *parent = nullptr);
    ~PaintWidget();

protected:
    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent*e);
    void mouseMoveEvent(QMouseEvent*e);
    void mouseReleaseEvent(QMouseEvent *e);
    bool drawMode;
    QList<QRect>DrawBuffer;
    QPoint p[2];
    QColor color;
    QList<QColor>ColorBuffer;
public slots:
    void showDialog();
private:
    Ui::PaintWidget *ui;
};
#endif
Код:
//paintwidged.cpp
#include "paintwidget.h"
#include "ui_paintwidget.h"
#include <QtWidgets>
#include <QtGui>

PaintWidget::PaintWidget(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::PaintWidget)
{
    ui->setupUi(this);
    QTextCodec*codec=QTextCodec::codecForName("UTF-8");
//    QTextCodec::setCodecForCStrings(codec);
   
    QAction*act=ui->menubar->addAction("Выбор цвета");
    
    act->setShortcut(QString("Alt+C"));
   
    connect(act,SIGNAL(triggered()),this,SLOT(showDialog()));
 
    p[0]=p[1]=QPoint(0,0);
    color=QColor(0,100,100);
    drawMode=false;
}

PaintWidget::~PaintWidget()
{
    delete ui;
}

void PaintWidget::mousePressEvent(QMouseEvent*e)
{
    if(e->button()==Qt::LeftButton)
    {
    drawMode=true; 
    p[0]=e->pos(); 
    }
}
void PaintWidget::mouseMoveEvent(QMouseEvent *e)
{
    if(drawMode) 
    {
        p[1]=e->pos(); 
        DrawBuffer.append(QRect(p[0],p[1])); 
        p[0]=p[1];
        
        update();
     }
}
void PaintWidget::paintEvent(QPaintEvent *event)
{
    if(DrawBuffer.size()<1)return;
    QPainter painter(this);
    QList<QRect>::const_iterator it=DrawBuffer.begin();
    do
    {
        painter.drawRect(*it++); 
    }
    while(it!=DrawBuffer.end());

}
Как мне исправить, чтобы рисовало именно прямоугольник, как в Paint, например?
KoTTeLLo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с классами на C# Sashaa_i C# (си шарп) 3 20.12.2015 15:19
работа с классами JinZh C++ Builder 2 20.04.2011 23:17
работа с классами в си++ Zolotce Помощь студентам 4 01.04.2011 22:49
работа с классами jec Общие вопросы C/C++ 30 05.09.2010 00:03
Работа с классами Superlotles Общие вопросы C/C++ 6 16.06.2010 17:15