[C++][QT] QToolButton - nowy paintEvent()

0

Witam!

Chciałbym nieco poprawić standardową funkcję paintEvent() QToolButton'a - pędziel zamiast jednolitego tła powinien "malować" pixmapą. I tu jak się domyślam w grę wchodzi dziedziczenie tej funkcji i dopiero poprawki. Przyznam, że w tą dziedzinę (dziedziczenie) nie bardzo się zagłębiałem i niestety nie bardzo wiem jak się za to zabrać. Byłbym wdzięczny za jakieś wskazówki, ewentualnie jakiś przejrzysty fragment kodu z podobnej operacji. "Zwykłe" przykłady w tym kierunku już przejrzałem, ale niestety tu nie potrafię ich wykorzystać.

z góry dzięki
pozdrawiam
herszt

0

Heh, chcesz poprawić, ale nie wiesz jak. Dobre dobre :D

0

sprawa jest prosta, wróć do podstaw obiektowości, poczytaj o dziedziczeniu i polimorfizmie ( zwłaszcza o metodach wirtualnych ) bo można by ci było to tłumaczyć godzinami, a i tak byś tego nie zrozumiał tylko ślepo zerżnął i po omacku coś zakodził. Za wcześnie na Qt.

0

Ok. Trochę sobie odświeżyłem wiedzę z tej dziedziny.

class myQToolButton : QToolButton
{
public:
	myQToolButton();
	~myQToolButton();
};

void myQToolButton::paintEvent(QPaintEvent * event)
{
	QPalette palette;
	palette.setBrush(QPalette::Window, QBrush(QPixmap(":/grafika/tlo.png")));
	this->setPalette(palette);
           [...]
}

nt

I teraz tylko jeszcze kilka pytań. Jeśli paintEvent() jest typu protected to mogę bez problemu zająć się jego ponownym napisaniem? Dwa - jeśli zacząłem już pisać tę funkcję to muszę ją dopisać do końca, tzn. pomimo, że została odziedziczona to ponowne jej definiowanie 'wymarze' poprzednią zawarość?

z góry przepraszam za banalne pytania
dzięki
pozdrawiam
herszt

0

Nie dowiedziałeś się za wiele skoro pytasz dalej o podstawy programowania obiektowego w c++. Modyfikator "protected" powoduje, że składowe danej klasy są niedostępne spod jawnie utworzonej instancji klasy ( czyli obiektu ), są one natomiast dostępne w klasie pochodnej ( w mechanizmie dziedziczenia również tworzona jest instancja klasy bazowej jednak bez twojej ingerencji dlatego napisałem "jawnie utworzonej" ). Czyli zasada działania jest taka, że nie masz do nich dostępu poza drogą dziedziczenia.

paintEvent jest metodą wirtualną dostępną z QWidget. Reimplementacja metody wirtualnej to jest nic innego jak nadpisanie jej funkcjonalności jednak wywoływana jest nadal w tym samym kontekście. W innych językach programowania możesz sterować tym przebiegiem czyli możesz daną metodę wirtualną przesłonić albo nadpisać, czyli możesz mieć jakby jej dwie wersję. W c++ reimplementując funkcję wirtualną nadpisujesz tą odziedziczoną lecz tylko na tym poziomie dziedziczenia, na którym się znajduje i taką ją wywołujesz.

PS
QToolButton może posiadać swojego rodzica warto to zaimplementować w klasie pochodnej czyli:

class MyToolButton : public QToolButton
{
    public:
        MyToolButton( QWidget*=0 );
};
MyToolButton::MyToolButton( QWidget *parent ) : QToolButton( parent ) {}

W deklaracji klasy, którą ty zamieściłeś w ostatnim poście brakuje ci deklaracji "void paintEvent(QPaintEvent * event)".

1 użytkowników online, w tym zalogowanych: 0, gości: 1