Diverse Fragen zum Zeichnen in Widgets

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Bang-Johansen
Beiträge: 43
Registriert: 11. Juli 2011 22:51

Diverse Fragen zum Zeichnen in Widgets

Beitrag von Bang-Johansen »

Hallo,

Ich beschäftige mich gerade zum ersten Mal mit dem QPainter; bitte deshalb um Nachsicht.
Bin in QT Anfänger; mit steigender Tendenz.

Ich möchte in einem Widget z.B. Widget2 eines QStackedwidgets, welches Teil eines größeren Mainwindows ist, diverse Linien zeichen.

Testweise bekomme ich eine Linie über das gesamte Mainwindow.

Code: Alles auswählen

void MainWindow::paintEvent(QPaintEvent *)
{
        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.drawLine(50,50,1000,1000);
}
Ich möchte die Linie(n) aber nur in diesem einen Widget (Widget2) haben.
Deshalb habe ich versucht, nur das Widget2 anzusprechen, was aber mit einer Fehlermeldung endetet:

Code: Alles auswählen

QPainter painter(Widget2);
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active

Kann ich nicht direkt in ein bestimmtes Widget zeichen?
Ich könnte mir zwar die Eckkoordinaten des Widgets ausrechen und nur innerhalb dieser Koordinaten zeichen, aber dann müßte ich bei
einem Wechsel auf ein anders Widget des QStackedwidget irgenwie die Linien wieder löschen und bei einem Wechsel auf Widget2 wieder
zeichnen.

Wie kann ich das anders lösen ?
Gibt es da einen besseren Weg?


Wann wird eigentlich das QPainterevent aufgerufen?
Beim Keypressevent ist es klar-> bei einem Tastendruck, aber bei diesem ?
Wenn ich z.B. Widget2->update() mache ??

Danke für Eure Antworten.

Bang-Johansen
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von odt »

Mach für jedes Widget eine eigene Klasse und implementiere dort den paintEvent. Ein Beispiel wäre das "Analog Clock Example", allerdings anstatt es zu showen, fügst Du es Deinem QStackedWidget hinzu.

QPaintEvent respektive QWidget::paintEvent wird aufgerufen, wenn das Fenster gezeichnet werden muss (z.B. weil vorher verdeckt war und neu in den Vorderung kommt) oder weil Du QWidget::update() oder QWidget::repaint() aufrufst. Details findest Du in der Hilfe QWidget::paintEvent. Wenn Du eine Taste drückst, wird nicht automatisch neu gezeichnet, im keyDown den update aufrufen.
ODT Informatik GmbH, Reto Tschofenig
Bang-Johansen
Beiträge: 43
Registriert: 11. Juli 2011 22:51

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von Bang-Johansen »

Hallo,

Danke für die Info.
So was ähnliches habe ich schon mal versucht, allerdings habe ich es nicht hinbekommen.

Wie binde ich die andere Klasse in das QStackedWidget ein ?
Die Klasse heißt z.B. Extern.
ein ->addWidget (Extern); funktioniert natürlich nicht.
Ich habe zwar ein paar QT Bücher, aber zu diesem Thema habe ich dort nicht gefunden.

Für ein paar Zeilen Beispielcode wäre ich sehr dankbar.

Bang-Johansen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von Christian81 »

addWidget() benötigt ein QWidget - also von QWidget ableiten und gut ist
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von odt »

Code: Alles auswählen

class Extern : public QWidget {
  void paintEvent... 
}

MainWindow::MainWindow(){
  QStackedWidget* mystackedwidget = new QStackedWidget();
  ....
  Extern* myextern = new Extern();
  mystackedwidget->addWidget( myextern );
  ...
}
ODT Informatik GmbH, Reto Tschofenig
Bang-Johansen
Beiträge: 43
Registriert: 11. Juli 2011 22:51

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von Bang-Johansen »

Hallo odt,
Extern* myextern = new Extern();
Danke für den Hinweis.
Natürlich muß ich das Widget so einbinden :oops:
Irgendwie war ich geistig abwesend.
Jedenfalls funktioniert es so.

Nur hätte ich noch eine Frage.
Wenn ich in dem externen Widget z.B. Buttons einfüge, kann ich über Mainwindow nicht direkt drauf zugreifen.
Bedeutet dies, ich muß in der neuen Klasse "Extern" Methoden und Slots für die Verarbeitung implementieren ?
z.B. Klick auf Button im Widget Extern -> Slot in der Klasse Extern -> emit Signal blablabla
und dann in Mainwindow über connect (&Extern, SIGNAL(blablabla()), ... ?

Vielen Dank und Grüße in die Schweiz

Bang-Johansen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von Christian81 »

Ja genau - alles im Mainwindow abhandeln sollte man aber nicht - es hat ja auch einen Grund warum es in einem extra Widget/Fenster ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Bang-Johansen
Beiträge: 43
Registriert: 11. Juli 2011 22:51

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von Bang-Johansen »

Hallo,
Christian81 hat geschrieben:Ja genau - alles im Mainwindow abhandeln sollte man aber nicht.
also mit anderen Worten, selbst die Layouts und Objekte, die in Mainwindow angezeigt werden, in extra Klassen
auslagern und dann nur die Komplettlayouts im Mainwindow einbinden?

Wie macht Ihr das eigentlich bei richtig großen Programmen?
Jedes größere Layout in eine eigene Klasse und Dateien?



Bang-Johansen
Bang-Johansen
Beiträge: 43
Registriert: 11. Juli 2011 22:51

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von Bang-Johansen »

Hallo,

Danke für Eure Antworten.
Ich habe es genau so hinbekommen, wie ich es immer wollte.

Eine kleine Frage aber wieder einmal:

Ich erstelle mehrere Objekte:

Code: Alles auswählen

 ExternEins = new extern;
 ExternZwei = new extern;
 ExternDrei = new extern;
Ich möchte aber beim Erstellen noch einen QString mitgeben, der in
einem QLabel in dem "extern Widget" angezeigt werden soll:

Code: Alles auswählen

 ExternEins = new extern (TextA);
 ExternZwei = new extern (TextB);
 ExternDrei = new extern (TextC);
Wie werte ich diesen Parameter in der Klasse extrern aus ?
Diese sieht folgendermaßen aus

Code: Alles auswählen

class extern : public QWidget
    {
    Q_OBJECT

    public:

        // Konstruktor und Destruktor anlegen
        extern ();
        ~extern();


    private:

        // Methode zur Erstellung des Widgets
        void CreateWidget ();

        QLabel *TestLabel; (hier soll der Text zugeordnet werden)
        ....
Wie stelle ich dies an?

Danke an alle

Bang-Johansen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Diverse Fragen zum Zeichnen in Widgets

Beitrag von Christian81 »

Entweder als Parameter im ctor oder als seaprate Funktion in der Klasse -> C++ Grundlagen ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten