Как запускать функцию paintEvent когда нужно?
Пишу программу на Qt c++ и мне нужно сделать запуск paintEvent при нажатии на кнопку, не понимаю как это сделать, в интернете пишут что все рисование должно происходить внутри этой функции, но тогда как мне вызвать ее в кнопку? Есть ли вариант просто расписать внутри этой функции что надо рисовать а потом при нажатии на кнопку просто вызвать??
P.S: Пробовал реализовать через сигналы и слоты , вот так:
Заголовочный:
//MainWindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
public slots:
void paintEvent(QPaintEvent *event);
};
#endif // MAINWINDOW_H
И сам cpp файл:
//MainWindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(paintEvent(QPaintEvent*)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *event) {
QPainter painter(this); // Создаём объект отрисовщика
painter.setPen(QPen(Qt::white, 1, Qt::SolidLine, Qt::FlatCap));
painter.drawLine(150,150,150,400);
painter.drawLine(150,150,400,150);
painter.drawLine(400,150,400,400);
painter.drawLine(150,400,400,400);
}
Но Qt выдает следующее:
QObject::connect: Incompatible sender/receiver arguments
QPushButton::clicked() --> MainWindow::paintEvent(QPaintEvent*)
Помогите пожалуйста, почему пишет тут ошибку и какие способы есть вообще решить эту проблему и рисовать при нажатии кнопки?
Ответы (1 шт):
Я пользуюсь QWidget::update() можно ещё использовать QWidget::repaint() но народ говорит это не лучший выбор.
Вот код вызова:
void Compass::paintEvent(QPaintEvent *)
{
... // тут рисую
}
void Compass::set_pitch(int val)
{
_myTexpr.m_pitch = val; // точка отрисовки
update(); // отрисовка по сути вызов paintEvent
}
вот сам класс :
class Compass : public QWidget
{
Q_OBJECT
public:
explicit Compass(QWidget *parent = 0);
~Compass();
void razmer_kompas(int x, int y);
void set_pitch(int val);
protected:
void paintEvent(QPaintEvent *event);
void keyPressEvent(QKeyEvent *event);
texnStructur _myTexpr;
};