[QT] QPainter Painter not active
Ostatnio zmodyfikowano 2021-05-10 16:44
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 #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 #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 figura.h #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 figura.cpp #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 |
|
DejaVu |
» 2021-05-10 13:17:37 |
|
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? |
|
killjoy |
» 2021-05-10 16:00:56 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. |
|
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!
|
|
« 1 » |