Как рисовать что-то с QPainter при нажатии кнопки - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над своим проектом из программирования, и мне нужно рисовать, например, круг каждый раз, когда нажимается кнопка с помощью QPainter. Это первая проблема, а вторая здесь заключается в том, что мне нужна некоторая информация, которая должна быть отправлена ​​в функцию рисования, например, вектор int, и возможность рисовать столько кругов, так как в векторе есть элементы с радиусами самих элементов. Я нашел код, основанный на сигналах и слотах.
Отправитель:

public:
    Listener(QObject *p = 0) : QObject(p) {
        QTimer * t = new QTimer(this);
        t->setInterval(200);
        connect(t, SIGNAL(timeout()), this, SLOT(sendData()));
        t->start();
    }
signals:
    void dataAvaiable(int, int);

public slots:
    void sendData() {
        emit dataAvaiable(qrand() % 200, qrand() % 200);
    }

Получатель:

    void receiveData(int x, int y) {
        QPainter painter(this);
        QPen pen(Qt::white, 5);
        painter.setRenderHint(QPainter::HighQualityAntialiasing);
        painter.setPen(pen);
        QPoint point(x, y);
        painter.drawEllipse(x, y, 100, 100);
        data.append(point);
    }

Само соединение в main. cpp

QObject::connect(&l, SIGNAL(dataAvaiable(int,int)), &w, SLOT(receiveData(int,int)));

Но код не Он подходит для моей конкретной задачи с кнопками и даже не хочет ничего рисовать, только любой круг. Тем не менее, в отладчике код выполняется правильно, а я относительно новичок в Qt и C ++, поэтому я не могу самостоятельно понять, в чем проблема и как решить мою задачу.
Может кто-нибудь, пожалуйста, сделайте минимум кода или просто объясните мне, в чем именно проблема? Нужно как можно скорее решить проблему. Спасибо.

Upd: подойдет любое возможное решение с QPainter или без него.

1 Ответ

0 голосов
/ 07 мая 2020

Пользователи Qt Forum дали мне ответ. Цитата: Из описания класса QPainter:

Предупреждение: Когда paintdevice является виджетом, QPainter можно использовать только внутри функции paintEvent () или в функции, вызываемой paintEvent (). Вы можете принудительно вызвать paintEvent (), вызвав update (), поэтому вы должны подключить сигнал onclicked () вашей кнопки к слоту update () виджета, на котором вы рисуете.

Для вашей второй проблемы , данные могут быть переменной-членом. Вот пример:

// mywidget.h
#include <QVector>
#include <QPoint>
// other includes and the constructor...
protected:
    virtual void paintEvent(QPaintEvent *event);

private slots:
    void onButtonClicked();

private:
    QPushButton* mButton;
    QVector<QPoint> mCirclesData;

// mywidget. cpp

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    mButton = new QPushButton(this);
   // customise your button...
    connect(mButton, &QPushButton::clicked, this, &MyWidget::onButtonClicked); 
}

//...
void MyWidget::onButtonClicked(){
    int x = qrand() % 200, y = x;
    mCirclesData << QPoint(x,y); 
    update(); // force calling paintEvent
}

void MyWidget::paintEvent(QPaintEvent *event)
{
     QPainter painter(this);
     QPen pen(Qt::white, 5);
     painter.setRenderHint(QPainter::HighQualityAntialiasing);
     painter.setPen(pen);     
     painter.drawEllipse(mCirclesData.last().x(), mCirclesData.last().y(), 100, 100);
}
``
...