Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[QT] QPainter Painter not active

Ostatnio zmodyfikowano 2021-05-10 16:44
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[QT] QPainter Painter not active
» 2021-05-10 12:37:17
Chciałem sobie poćwiczyć nieco tworzenie klas w qt i napisałem program którego zadaniem było, po nacisnięciu przycisku button, narysowanie prostej figury (kwadrat). Program się ładnie kompiluje i uruchamia ale nie wyswietla figury. Nie wiem co może być tego przyczyną? Proszę o pomoc w rozwiazaniu tego problemu... Dane z debugera zamieszczam na samym końcu tego postu.



dialog.cpp
C/C++
#include "dialog.h"
#include "ui_dialog.h"
#include "tfigura.h"

Dialog::Dialog( QWidget * parent )
    :
QDialog( parent )
   
, ui( new Ui::Dialog )
{
   
ui->setupUi( this );
}

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


void Dialog::on_pushButton_clicked()
{
   
TFigura tfg;
   
tfg.rysuj_figure();
}

dialog.h
C/C++
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog
    : public QDialog
{
   
Q_OBJECT
   
public:
   
Dialog( QWidget * parent = nullptr );
   
~Dialog();
   
private slots:
   
void on_pushButton_clicked();
   
private:
   
Ui::Dialog * ui;
};
#endif  // DIALOG_H

figura.h
C/C++
#ifndef TFIGURA_H
#define TFIGURA_H

#include <QPainter>
#include <QDialog>
#include <QPen>

class TFigura
    : public QDialog
{
   
Q_OBJECT
public:
   
TFigura();
   
~TFigura();
   
   
void rysuj_figure();
};

#endif  // TFIGURA_H

figura.cpp
C/C++
#include "tfigura.h"

TFigura::TFigura()
{
   
}
TFigura::~TFigura()
{
   
}
void TFigura::rysuj_figure()
{
   
QPainter rysuj( this );
   
QPen pen1( Qt::black );
   
   
int x = 10;
   
int y = 10;
   
int szerokosc = 200;
   
int wysokosc = 200;
   
   
QRect rect( x, y, szerokosc, wysokosc );
   
rysuj.drawRect( rect );
   
}

Najnowsze wiadomości z Debugera:

QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::drawRects: Painter not active
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::drawRects: Painter not active
P-178573
DejaVu
» 2021-05-10 13:17:37
https://www.youtube.com/watch?v=iYQSGVVZ7Us

A powyższy tutorial próbowałeś?

Jest krótki i pokazuje, że coś się da rysować.

https://doc.qt.io/qt-5/qtwidgets-painting-basicdrawing-example.html
P-178574
wojownik266
Temat założony przez niniejszego użytkownika
» 2021-05-10 14:35:21
Te materiały które mi podałeś z grubsza są mi znane. Tak że program który wyświetlałby figurę, podpierając się ty filmikiem i dokumentacją, potrafiłbym napisać... Problem w tym że jak napiszę swoją klasę i umieszczę w niej tą funkcję która ma wyrysować kwadrat a następnie wywołam tą metodę w zdarzeniu np. "on_pushButton_clicked()" to jak już mówiłem: nic się nie rysuję. Sama funkcja bez wywolywania jej w mojej klasie i metodzie  pushbutton działa wyśmienicie. A nie działa  prawdopodobnie dlatego że jak podpowiada debuger "QPainter::drawRects: Painter not active". Nie wiem jak aktywować tego QPaintera? Może jakieś sugestie?
P-178575
killjoy
» 2021-05-10 16:00:56
C/C++
TFigura tfg;
tfg.rysuj_figure();
Ten kawałek kodu rysuje w próżni, bo tfg nie ma ustawionego widgeta-rodzica, nie ma zatem na czym rysować. A nawet jeżeli tfg by miało ustawionego poprawnego widgeta-rodzica, to w najlepszym wypadku przy tym kodzie, w ogóle nic by się nie wyświetliło/rysunek by znikł po repaincie, a w najgorszym i co bardziej prawdopodobne, wysypało program (nie mam jak tego sprawdzić, analizuję kod na oko), gdyż tfg jest obiektem tymczasowym. Nie wspominając już, że dla QWidget i w klasach, które po nim dziedziczą, QPainter nie może być używany nigdzie indziej niż w paintEvent().

Dałoby się ten kod przerobić do takiej formy, żeby rysować przy użyciu instancji klasy QDialog (tfg), ale to trochę mija się z celem QPaintera, przynajmniej dla takich prostych zastosowań. Lepiej by było napisać własną implementację paintEvent() w klasie Dialog. Popatrz na źródła, które podrzucił @DejaVu.

PS. Jeżeli dalej chcesz rysować QDialogiem, to i tak trzeba zrobić to wszystko co napisałem w ostatniej części i dopiero tak spreparowanemu widgetowi ustawić parenta na Widget rodzica, w którym ma się wyświetlić, pamiętając o tym, żeby rysowany Dialog nie został zniszczony przed jego rodzicem. Zatem, tak czy siak, najlepiej by było zacząć od tego co podlinkował @DejaVu.

P-178576
wojownik266
Temat założony przez niniejszego użytkownika
» 2021-05-10 16:44:14
Podobno jeśli nie wiadomo od czego zacząć to najlepiej zacząć od początku. I tak też zrobię. Dziękuję za odpowiedzi i zyczę miłego dnia!
P-178577
« 1 »
  Strona 1 z 1