• Как рисовать в QT чтобы прошлые объекты не удалялись?

    @Mitbaru Автор вопроса
    Александр Ананьев,
    Скинул сразу весь код, на всякий случай. Если я правильно понимаю, окно очищается в функциях createLine, createEllipse, createRectangle с помощью update(), но если её убрать, то обновляться и рисоваться рисунок не будет.
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QtWidgets>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        statusBar = new QStatusBar(this);
        setStatusBar(statusBar);
        statusBar->showMessage("");
        setWindowTitle(tr("Babaika"));
    
        widthDialog = new QDialog(this);
        connect(ui->widthAction, SIGNAL(triggered()), this, SLOT(tuneWidth()));
        widthLineEdit = new QLineEdit(widthDialog);
        QVBoxLayout *layout = new QVBoxLayout(widthDialog);
        QPushButton *okButton = new QPushButton(tr("Ок"), widthDialog);
        connect(okButton, SIGNAL(clicked()), this, SLOT(okButton_clicked()));
        connect(okButton, SIGNAL(clicked()), widthDialog, SLOT(close()));
        widthDialog->setWindowTitle("Толщина");
        layout->addWidget(widthLineEdit);
        layout->addWidget(okButton);
    
        connect(ui->lineColorAction, &QAction::triggered, this, &This::colorDialog);
        connect(ui->fillColorAction, &QAction::triggered, this, &This::colorDialog);
    
        connect(ui->lineAction, &QAction::triggered, this, &This::createLine);
        connect(ui->ellipseAction, &QAction::triggered, this, &This::createEllipse);
        connect(ui->rectangleAction, &QAction::triggered, this, &This::createRectangle);
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::paintEvent(QPaintEvent *){
        QPainter painter(this);
        QPen pen(Qt::black, penWidth, Qt::SolidLine, Qt::RoundCap);
        pen.setColor(color);
        painter.setPen(pen);
    
        if (shapeToDraw == Shape::LINE){
            createLine();
            painter.drawLine(firstX, firstY, secondX, secondY);
        }
        else if (shapeToDraw == Shape::ELLIPSE){
            createEllipse();
            painter.drawEllipse(firstX, firstY, secondX - firstY, secondY - firstY);
        }
        else if(shapeToDraw == Shape::RECTANGLE){
            createRectangle();
            painter.drawRect(firstX, firstY, secondX - firstX, secondY - firstY);
        }
        painter.end();
    }
    
    void MainWindow::createRectangle(){
        shapeToDraw = Shape::RECTANGLE;
        update();
    }
    
    void MainWindow::createEllipse(){
        shapeToDraw = Shape::ELLIPSE;
        update();
    }
    
    void MainWindow::createLine(){
        shapeToDraw = Shape::LINE;
        update();
    }
    
    void MainWindow::colorDialog(){
        color = QColorDialog::getColor(Qt::white, this, "Выберите цвет");
    }
    
    void MainWindow::okButton_clicked(){
        bool ok;
        QString strPenWidth = widthLineEdit->text();
        penWidth = strPenWidth.toInt(&ok, 10);
    }
    
    void MainWindow::tuneWidth(){
        widthDialog->show();
    }
    
    void MainWindow::mouseMoveEvent(QMouseEvent *event){
        int x = event->x();
        int y = event->y();
        secondX = event->x();
        secondY = event->y();
        QString coords = QString("x: %1, y: %2").arg(x).arg(y);
        statusBar->showMessage(coords);
    }
    
    void MainWindow::mousePressEvent(QMouseEvent *event){
        firstX = event->x();
        secondX = firstX;
        firstY = event->y();
        secondY = firstY;
    }
    
    void MainWindow::mouseReleaseEvent(QMouseEvent *event){
        secondX = event->x();
        secondY = event->y();
    }
  • Работа с рисованием в Qt. Почему не получается рисовать после оператора if?

    @Mitbaru Автор вопроса
    Заранее извиняюсь за возможно глупые уточнения.
    Получается в header файле создаем
    enum class Shape { NONE, LINE, ELLIPSE, RECTANGLE };


    затем в cpp файле создаём функцию
    void MainWindow::createLine(){
        Shape shareToDraw = Shape::LINE;
    }


    и последним действием создаём
    connect(ui->lineAction, SIGNAL(triggered()), this, SLOT(createLine()));

    Я правильно понял?
  • Работа с рисованием в Qt. Почему не получается рисовать после оператора if?

    @Mitbaru Автор вопроса
    Спасибо за ответ, но к сожалению не помогло(
    642ee0a188a57276917699.png
    попробовал вынести setChecked(false) за условия, добавив его в самый конец функции, но это не помогло. Затем попробовал вообще закомментить все setChecked(false), но это так же не помогло. Все работает так же, но теперь из-за того что нет очистки чекбоксов условие в любом случае получается true, соответственно просто спамит в qDebug)
    P.S. вообще задача рисовать фигуру путём клика на какой либо QAction, может подскажете какой-то более простой и рабочий способ? Либо может остались идеи по поводу этого способа)