Objectanrop Qt4 C++

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Objectanrop Qt4 C++

Inlägg av Oltronix »

Jag har två små undran:
1. Varför kommer jag till MyWidget::paintEvent() utan något explicit anrop utförs?
2. Varför anropas MyWidget::paintEvent() 2ggr?

(Koden är egentligen skriven för att jag inte fattade hur drawPies parametar fungerade i fönstret. Det gör fortfarande inte men verkar kunna hantera ändå)
Utskrift:

Kod: Markera allt

MyWidget constructor
windowTitle @paintEvent: Viewport object A
width():  500 height(): 
rect.x(): 50 50 200 200
wind.x(): -100 -100 200 200

windowTitle @paintEvent: Viewport object A
width():  500 height(): 
rect.x(): 50 50 200 200
wind.x(): -100 -100 200 200

.pro kod

Kod: Markera allt

######################################################################
# Automatically generated by qmake (2.01a) tir. sep. 8 11:39:19 2020
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

OBJECTS_DIR             = obj
MOC_DIR                 = moc
RCC_DIR                 = rcc

# Input
HEADERS += viewport.h
SOURCES += main.cpp viewport.cpp
main.cpp

Kod: Markera allt

#include <QApplication>
#include "viewport.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget mywidget(0, 500, 500);
    mywidget.setWindowTitle(QObject::tr("Viewport object A"));
    mywidget.show();

    return app.exec();
}
viewport.h

Kod: Markera allt

#ifndef TEST_H
#define TEST_H

#include <QWidget>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0, int x=0, int y=0);
    void paintEvent(QPaintEvent *event);

private:
    int x_led, y_led;

};
#endif
viewport.cpp

Kod: Markera allt

//https://stackoverflow.com/questions/19160030/whats-painter-setviewport-exactly-do
#include <QtGui>
#include <iostream>
#include "viewport.h"

MyWidget::MyWidget(QWidget *parent, int x, int y) : x_led(x), y_led(y), QWidget(parent) {
std::cout << "MyWidget constructor" << std::endl;
}

void MyWidget::paintEvent(QPaintEvent *event)
{
QString title=windowTitle();
std::string utf8_text = title.toUtf8().constData();
std::cout << "windowTitle @paintEvent: " << utf8_text << std::endl;

QPainter painter(this);
QPen pen(Qt::blue,3,Qt::SolidLine);
painter.setPen(pen);
this->resize(x_led,y_led);

painter.setViewport(50,50,200,200);
painter.setWindow(-100,-100,200,200);
QRect rect = painter.viewport();
QRect wind = painter.window();
std::cerr << "width():  " << width() << " height(): " <<std::endl;
std::cerr << "rect.x(): " <<  rect.x() << " "<< rect.y()  << " "<< rect.height() << " "<< rect.width() <<std::endl;
std::cerr << "wind.x(): " <<  wind.x() << " "<< wind.y()  << " "<< wind.height() << " "<< wind.width() <<std::endl << std::endl;

    /* Draw pie slice */
#define pie_slice
#ifdef pie_slice    
    painter.setPen(QPen(Qt::red));  
    painter.drawRect(0,0,5,5);    
    painter.drawRect(-100,-100,5,5);
    painter.drawRect(200,200,5,5);
    painter.drawRect(140,140,5,5);
    painter.drawRect(150,150,5,5);
    painter.setBrush(QBrush(Qt::red));

    painter.drawPie(QRect(-125,-125,250,250), 0*16, 45*16 );
    painter.drawPie(QRect(-125,0,250,250), 0*16, 45*16 ); 
    painter.setBrush(QBrush(Qt::blue));    

    painter.drawPie(QRect(-110,-110,220,220), 0*16, 45*16 ); //NB x,y lika och witdh och height 2*x
#endif

}
kodar-holger
EF Sponsor
Inlägg: 916
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Objectanrop Qt4 C++

Inlägg av kodar-holger »

paintEvent är en virtuell metod i basklassen QWidget. Du överrider den i din klass och den anropas av basklassen när kontrollen behöver ritas om. (Egentligen när kontrollen får ett meddelande från fönsterhanteraren. Är det windows heter det wm_paint om jag minns rätt). Det sker varje gång fönsterhanteraren tycker att kontrollen behöver ritas om. Om det är två gånger så får du två anrop men sannolikt kommer den anropas mycket mer än så.

Finns det nån anledning att du hänger kvar i Qt4?
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: Objectanrop Qt4 C++

Inlägg av Oltronix »

Jag fattade inte att paintEvent fanns i basklassen och jag skrev om den (överrider). Sen ere väl så att jag inte tänker event-handling med ryggmärgen eller med något annan hjärnsubstans för den delen heller. När man maximerar fönstret blir det massa anrop till paintEvent.

Vaför inte Qt5? Tja jag har väl flera bortförklarningar. Bla har har en bok som täcker Qt4. "C++ GUI Programming with Qt4" Jasim Blanchette och Mark Summerfield. Bra bok. Kan rekomenderas. Försökte installera Qt5 på Raspberry Pi 4, som är tänkt som målsystem, men det misslyckades. Så jag la ner det. Jag har ju massa att lära för att få Qt baskunskaper som jag kan fortsätta på desktopen ett tag till. Se var det någon på youtube som hade synpunkter på Qt5 eller var någon version av PyQt5. Kommer inte ihåg riktigt.
kodar-holger
EF Sponsor
Inlägg: 916
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Objectanrop Qt4 C++

Inlägg av kodar-holger »

Skillnaderna mellan Qt4 och Qt5 var minimala så vårt byte för några år sen tog inte många timmar på ett hyfsat stort system. Ungefär vad det tar mellan två punktreleaser än idag. Men man bör vara uppmärksam på de deprecations som är gjorda och se till att arbeta bort dom snarast. 5.15.1 är senaste releasen och Qt6 är beräknad till 1e december.
När man gick från Qt3 till Qt4 hade det visst varit flera veckors arbete, men det var före min tid i det projektet och jag kör enbart på Windows och C++ så vet inte något om de andra.

Nu har jag programmerat för fönstersystem sen typ 1993 så det event-baserade känns många gånger helt naturligt, men jag kan förstå att det är en viss tröskel att gå in i det. Läste Petzold efter några år, och det kanske var då det klarnade mer hur det fungerar under kulisserna. Sen är ju oftast allt detta dolt under ett objektorienterat ramverk som ex.vis Qt, mfc eller vcl.

Qt's evinnerliga signals and slots känns trots snart 10 år med eländet fortfarande just som elände. En god anledning att inte köra Qt4 är att det finns möjlighet att använda en ny syntax för connect som larmar redan vid kompilering när man gör fel. Något jag byter till i existerande kod när man ändå är och ändra någonstans.

Connect(objekt, SIGNAL(namn), annatobjekt, SLOT(annatnamn) blir istället
Connect(objekt, &klass::namn, annatobjekt, &annanklass::namn)

Problemet med första syntaxen är som sagt att kompilatorn sväljer vad som helst. Och sen får man möjligen en debug-utskrift nånstans vid exekvering som säger att det inte går.
Nackdelen med den andra är att den är mer kräsen på att argumentlistorna matchar, men får man den genom kompilatorn fungerar det sen.

Har jag sagt att jag gillar Ada bättre?

Appropå paintEvent så är det lite udda. En av mycket få saker som inte görs med just signals and slots. Det är någon keyboardEvent också vad jag minns. Sen är det att göra slots för att ta emot anrop från Qt för olika events.
Skriv svar