[QT] mehrere widgets in einem mainwindow?

sammy2ooo

voll Tohuwabohu
ich moechte mehrere plot widgets in einem fenster darstellen. Nur wie??? Aus der QT doku werd ich nicht schlau...

Code:
int main(int argc, char **argv) 
{
        QApplication a(argc, argv);
        Plot plot;

        a.setMainWidget(&plot);

        plot.resize(500, 300);
        plot.show();

        return a.exec();
}
 
du brauchst einen container, der dann deine widgets enthält...

nach kurzem gucken in die doku z.b. mit QSplitter

auf bald
oenone
 
danke für deine Hilfe. Allerdings brauch ich nochmals Hilfestellung.
Code:
     QSplitter *splitter = new QSplitter(parent);
     QListView *listview = new QListView;
     QTreeView *treeview = new QTreeView;
     QTextEdit *textedit = new QTextEdit;
     splitter->addWidget(listview);
     splitter->addWidget(treeview);
     splitter->addWidget(textedit);
d.h. ich erzeuge zunächste ein neues QSplitter Objekt. Da gehts schon los. Was ist mit parent gemeint? Ist das mein QApplication Objekt, eigentlich verlangt der Konstuktor ein QWidget... http://doc.trolltech.com/4.2/qsplitter.html#QSplitter
Code:
QSplitter splitter = new QSplitter(parent);
Dann erzeuge ich ein paar Widgets, bzw. neue Plot Objects
Code:
Plot plot1, plot2;

splitter.addWidget(&plot1);
splitter.addWidget(&plot2);
addWiget() nimmt als Parameter ein QWidget Pointer. Natürlich funktioniert das nicht mit meinem Plot Object http://qwt.sourceforge.net/class_qwt_plot.html. Nur wie pack ich nun diesen Plot da rein :confused:

Code:
#ifndef PLOT_H
#define PLOT_H

#include <cmath>
#include <qapplication.h>
#include <qsplitter.h>
#include <qwt/qwt_plot.h>
#include <qwt/qwt_data.h>

class Plot : public QwtPlot {
        private:
                static int const NPOINTS = 29;
                double x[NPOINTS];
                double ysin[NPOINTS];
...

wäre nett wenn mir nochmals jemand unter die Arme greifen könnte...
 
d.h. ich erzeuge zunächste ein neues QSplitter Objekt. Da gehts schon los. Was ist mit parent gemeint? Ist das mein QApplication Objekt, eigentlich verlangt der Konstuktor ein QWidget... http://doc.trolltech.com/4.2/qsplitter.html#QSplitter
dann guck dir die doku nochmal an, genau da wo du verlinkt hast...
Code:
QSplitter::QSplitter ( QWidget * parent = 0 )
d.h. wenn es kein parent gibt, einfach null übergeben.

Dann erzeuge ich ein paar Widgets, bzw. neue Plot Objects
[...]
addWiget() nimmt als Parameter ein QWidget Pointer. Natürlich funktioniert das nicht mit meinem Plot Object http://qwt.sourceforge.net/class_qwt_plot.html. Nur wie pack ich nun diesen Plot da rein :confused:
hä? das versteh ich nicht... deine Plot-Objekte sind doch urenkel von QWidget? da sollte es doch keine Probleme geben?

auf bald
oenone
 
also mit null übergeben meinst du einfach nichts übergeben, oder? Denn QWidget * parent = 0 ist für mich ein Standardparameter, der immer gesetzt wird sobald ich kein Argument übergebe.

Code:
Plot *plot = new Plot;
Plot *plot1 = new Plot;

QSplitter *splitter = new QSplitter();
splitter->addWidget(plot);
splitter->addWidget(plot1);

http://doc.trolltech.com/4.2/qsplitter.html#addWidget

sollte doch so passen, oder hab ich was grundlegendes nicht verstanden?

sammy@uranos > make
building main.o
/usr/qt/3/include/qsplitter.h: In function 'int main(int, char**)':
/usr/qt/3/include/qsplitter.h:124: error: 'QSplitterLayoutStruct* QSplitter::addWidget(QWidget*, bool)' is private
main.cpp:111: error: within this context
/usr/qt/3/include/qsplitter.h:124: error: 'QSplitterLayoutStruct* QSplitter::addWidget(QWidget*, bool)' is private
main.cpp:112: error: within this context
make: *** [main.o] Error 1
 
Als Alternative kannst Du, wenn Du den Designer nicht nehmen moechtest, auch mehrere Boxen (QHBox, QVBox) schachteln und davon die erste als MainWidget angeben. Allerdings wird es dann schwierig, die Boxen in der Groesse anzupassen.

HTH
 
okay, danke für die Antworten. Das erklärt natürlich einiges. D.h. ich müsste nun noch in der Klasse Plot einen Konstruktor schreiben. Oder reicht es eine Klasse zu erben, wie QWidget?
 
Ich verstehe nicht, was Du meinst.

Ich kenn Dein Design nicht, aber falls Du eine Klasse Plot hast, die irgendwas zeichnet, dann sollte die soweit ich weiss, von QWidget erben und kann dann in den Boxen fuer die Anzeige verwendet werden.
 
ich bekomme:

main.cpp:109: error: no matching function for call to 'Plot::Plot(QSplitter*&)'
include/plot.h:21: note: candidates are: Plot::Plot()
include/plot.h:10: note: Plot::Plot(const Plot&)

class Plot : public QwtPlot {
private:
static int const NPOINTS = 29;
double x[NPOINTS];
double ysin[NPOINTS];
double ycos[NPOINTS];
double radius[NPOINTS];
double ypressure[NPOINTS];
double yvolumen[NPOINTS];

public:
Plot();
void getData();
};

main.cpp
QSplitter *splitter = new QSplitter();
Plot *plot = new Plot(splitter);
Plot *plot1 = new Plot(splitter);

sorry wegen den anfängerfragen...also die Klasse Plot sollte durch QwtPlot schon von QWidget geerbt haben...
 
Das ist auch eher ein C++ Problem. ;)

Du hast keinen Constructor, der einen Parameter vom Typ QWidget* oder einer abgeleiteten Klasse akzeptiert. Daher bekommst Du den Fehler.

Du brauchst sowas (Ausschnitt):
Code:
class Plot {
 public:
   Plot(QWidget *parent);
};

Und dann...
Code:
Plot::Plot(QWidget *parent)
 : QwtPlot(parent) {
}
 
Zuletzt bearbeitet:
okay, almost there...

main.cpp
Code:
QSplitter *splitter = new QSplitter();
Plot *plot = new Plot(splitter);
Plot *plot1 = new Plot(splitter);

plot.cpp
Code:
Plot::Plot(QWidget* parent, const char* name, int f) : QWidget(parent, name, f) {
}

plot.h
Code:
class Plot : public QWidget, public QwtPlot {
...
        public:
                Plot();
                Plot(QWidget* parent=0, const char* name=0, int f=0);
...

building plot.o
include/plot.h:10: warning: direct base 'QWidget' inaccessible in 'Plot' due to ambiguity
Done
building functions.o
Done
building main.o
include/plot.h:10: warning: direct base 'QWidget' inaccessible in 'Plot' due to ambiguity
main.cpp: In function 'int main(int, char**)':
main.cpp:109: warning: unused variable 'plot'
main.cpp:110: warning: unused variable 'plot1'
Done
building executable
main.o: In function `main':
main.cpp:(.text+0x557): undefined reference to `Plot::Plot(QWidget*, char const*, int)'
main.cpp:(.text+0x5c7): undefined reference to `Plot::Plot(QWidget*, char const*, int)'
collect2: ld returned 1 exit status
make: *** [main] Error 1

:grumble: :grumble:
 
Der Constructor muss ein QWidget* als Parameter akzeptieren. Diesen Parameter kann man dann -zumindest bei den QT Klassen- verwenden, um die Parentklasse, also die von der die aktuelle Klasse abgeleitet ist, zu initialisieren.

Beispiel (nicht ganz vollstaendig):
Code:
QVBox *box = new QVBox();
QButton *btn = new QButton(box);
In diesem Fall ist durch den Aufruf in der 2. Zeile die Beziehung zwischen btn und box definiert.

Analog dazu musst Du das auch machen. Der 1. Beispielcode aus meinem vorherigen Posting ist die Definition im Header-File und der 2. Beispielcode die Implementation im .cc/.cpp File.

Wenn Du Dir die Beispiele auf der QT Seite anschaust, wirst Du sehen, dass dort die Klassen so aufgebaut sind.


Du hast dies auch versucht mit Deinem Code. Allerdings hattest Du den Constructor von der Plot Klasse falsch definiert. Eine richtige Definition findest Du in meinem letzten Posting.


Hab grad Dein 2. Posting gesehen. Du brauchst nicht von QWidget erben, da QwtPlot schon von QWidget erbt, so ist zumindest die Fehlermeldung zu deuten. Zum anderen darfst Du dann auch nicht mehr QWidget initialisieren, sondern musst QwtPlot initialisieren.

Sorry, mein 1. Beispiel war auch falsch. Hier die korrigierte Fassung:
Code:
class Plot : public QwtPlot {
 public:
   Plot(QWidget *parent);
};

HTH
 
Zuletzt bearbeitet:
also so:

plot.h
Code:
class Plot : public QwtPlot {
...
        public:
                Plot();
                Plot(QWidget* parent);

plot.cpp
Code:
Plot::Plot(QWidget* parent) : QwtPlot(parent) {


}

main.cpp
Code:
...
QSplitter *splitter = new QSplitter();
Plot *plot = new Plot(splitter);

das endet in einem
cleaning up files
Done
building plot.o
Done
building functions.o
Done
building main.o
main.cpp: In function 'int main(int, char**)':
main.cpp:109: warning: unused variable 'plot'
Done
building executable
main.o: In function `main':
main.cpp:(.text+0x547): undefined reference to `Plot::Plot(QWidget*)'
collect2: ld returned 1 exit status
make: *** [main] Error 1
 
Die Ausschnitte, die Du postest machen das Debuggen etwas schwerer.

Also: undefined reference deutet daraufhin, dass Du die plot.o nicht zum Linken mit verwendest.

unused variable ist nur 'ne Warnung.
 
Zurück
Oben