Probleme mit dem Graphics View Framework

Alles rund um die Programmierung mit Qt
Antworten
SuperSonik
Beiträge: 69
Registriert: 29. Januar 2007 10:40

Probleme mit dem Graphics View Framework

Beitrag von SuperSonik »

Hallo Leute,
ich versuche gerade mit dem Graphics View Framework klar zu kommen.
Zunächst habe ich mir im Designer eine Oberfläche gebastelt. In ihr ist der
QGraphicsView enthalten. In der entsprechenden Klasse habe ich mir danach
eine QGraphicsScene und zu Testzwecken ein QGraphicsSvgItem angelegt. Das ganze findet jetzt beim testen erstmal im Konstruktor der
von der ui_ - Klasse abgeleiteten Klasse statt.

Code: Alles auswählen

tga_draw_widget::tga_draw_widget(QWidget* parent /*= 0*/, Qt::WFlags flags /*= 0*/) : QWidget(parent, flags)
{
	setupUi(this);
	test = new QGraphicsSvgItem(QString::fromUtf8("icons/tga/luftkuehler.svg"));
	scene = new QGraphicsScene(this);
	scene->addItem(test);
	this->graphicsView = new QGraphicsView(scene,parent);
	
}
Leider bekomme ich beim Starten des Programms die Fehlermeldung:

"QPixmap: Must construct a QApplication before a QPaintDevice"
Das ist mein erstes Problem.

Als zweites würde ich gerne wissen wie man die Position des Items in der Scene setzen kann.
Gruß,
SuperSonik
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

"QPixmap: Must construct a QApplication before a QPaintDevice"
Das ist kein Problem, sondern eine klar Aussage...

Außerdem, wenn du schon ein QGraphicsSvgItem verwendest, dann würde ich auch die Dokumentation dazu durchlesen, und da gibt es ein setPos() was ebenfalls aussagekräftig genug sein sollte.
SuperSonik
Beiträge: 69
Registriert: 29. Januar 2007 10:40

Beitrag von SuperSonik »

upsala hat geschrieben:
"QPixmap: Must construct a QApplication before a QPaintDevice"
Das ist kein Problem, sondern eine klar Aussage...

Außerdem, wenn du schon ein QGraphicsSvgItem verwendest, dann würde ich auch die Dokumentation dazu durchlesen, und da gibt es ein setPos() was ebenfalls aussagekräftig genug sein sollte.
Du hast natürlich recht. setPos() - habe ich gerade auch gefunden, sorry.

Zu der Fehlermeldung: Ich weiß, dass diese Meldung eine klare Aussage ist.
Ich verstehe aber trotzdem nicht wo das Problem ist. Das QGraphicsView- Widget ist ja in einer Oberfläche integriert für die ich natürlich eine QApplication erzeuge.
DeepDiver
Beiträge: 34
Registriert: 7. November 2007 10:10
Wohnort: Fürstenfeldbruck
Kontaktdaten:

Beitrag von DeepDiver »

Kannst Du die Sourcen posten?

Dann können wir besser helfen.

CU Tom
SuperSonik
Beiträge: 69
Registriert: 29. Januar 2007 10:40

Beitrag von SuperSonik »

DeepDiver hat geschrieben:Kannst Du die Sourcen posten?

Dann können wir besser helfen.

CU Tom
Klar mache ich. Das sind wohl schon einige Dateien.

main.cpp:

Code: Alles auswählen

#include "mobila.h"

#include <QtGui/QtGui>
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
	QResource::registerResource("./MOBILA.rcc"); 
    QApplication a(argc, argv);
    MOBILA w;
	w.showMaximized();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}
mobila.h:

Code: Alles auswählen

#ifndef MOBILA_H
#define MOBILA_H


#include <QtGui/QMainWindow>
#include <QtGui/QPaintEvent>
#include <QtGui/QVBoxLayout>
#include "ui_mobila.h"
#include "my_info_window.h"
#include "new_projekt_window.h"
#include "projekt_name_window.h"
#include "tga_draw_widget.h"
#include "logger.h"


class MOBILA : public QMainWindow
{
    Q_OBJECT

public:
    MOBILA(QWidget *parent = 0);
    ~MOBILA();
	//void paintEvent(QPaintEvent *event);

private:
    Ui::MOBILAClass ui;
    my_info_window *info; 
    new_projekt_window *new_projekt;
    projekt_name_window *projekt_name;
    QString pn;
    int selected_question_number;
	logger *testo;
	tga_draw_widget *tga_anzeige;
	QVBoxLayout *layout_main;
    
private slots:
    void show_info(void);
    void new_project(void);
    void get_question_selected(int nummer);
    void get_project_name(const QString name);
};

#endif // MOBILA_H

mobila.cpp:

Code: Alles auswählen


#include "mobila.h"
#include "new_projekt_window.h"
#include <QtCore/QDateTime>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPainter>
#include <QtGui/QPen>
#include <QtGui/QBrush>
#include <QtGui/QPaintEvent>
#include "logger.h"


MOBILA::MOBILA(QWidget *parent)
    : QMainWindow(parent)
{
	ui.setupUi(this);
	new_projekt = new new_projekt_window(this);
	projekt_name = new projekt_name_window(this);

	tga_anzeige = new tga_draw_widget(ui.widget_tga);
	


	layout_main = new QVBoxLayout(ui.widget_tga);
	layout_main->setMargin(0);
	layout_main->setSpacing(0);
	layout_main->setContentsMargins(5,0,0,0);
	layout_main->addWidget(tga_anzeige);
	ui.widget_tga->setLayout(layout_main);


	connect(ui.action_ber_Mobila,SIGNAL(triggered()),this,SLOT(show_info()));
	connect(ui.actionSchlie_e,SIGNAL(triggered()),this , SLOT( close() ) );
	connect(ui.actionNeues_Projekt,SIGNAL(triggered()),this,SLOT(new_project()));
	connect(new_projekt,SIGNAL(question_selected(int)),this,SLOT(get_question_selected(int)));
	connect(projekt_name,SIGNAL(send_project_name(const QString)),this,SLOT(get_project_name(const QString)));
}

MOBILA::~MOBILA()
{

}


void MOBILA::show_info()
{
	info = new my_info_window(this);
	info->show();
	info->activateWindow();

}

void MOBILA::new_project()
{
	new_projekt->show();
	new_projekt->activateWindow();
}

void MOBILA::get_question_selected(int nummer)
{
	this->selected_question_number = nummer;
	QString nummer2(QString::number(nummer));
	ui.label_status->setText(nummer2);
	ui.treeWidget_projekt->setColumnCount(1);
	QList<QTreeWidgetItem *> items;
	items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("TGA_Heizung"))));
	ui.treeWidget_projekt->insertTopLevelItems(0, items);  
	ui.treeWidget_projekt->setHeaderLabel ("");
	projekt_name->show();
	projekt_name->activateWindow();
}

void MOBILA::get_project_name(const QString name)
{
	this->pn = name;
	ui.treeWidget_projekt->setHeaderLabel (name);
}

tga_draw_widget.h:

Code: Alles auswählen

#ifndef TGA_DRAW_WIDGET_H_
#define TGA_DRAW_WIDGET_H_

#include "./Ui_tga_draw_widget.h"
#include <QtSvg/QtSvg>
#include <QtGui/QGraphicsScene>


class tga_draw_widget : public QWidget, protected Ui_tga_draw_widget
{
	Q_OBJECT
public:
	tga_draw_widget(QWidget* parent = 0, Qt::WFlags flags = 0);
	virtual ~tga_draw_widget();
private:
	QGraphicsSvgItem *test;
	QGraphicsScene *scene;

};
#endif

tga_draw_widget.cpp:

Code: Alles auswählen

#include "tga_draw_widget.h"
#include <QtSvg/QtSvg>
#include <QtCore/QString>
#include <QtGui/QGraphicsScene>

tga_draw_widget::tga_draw_widget(QWidget* parent /*= 0*/, Qt::WFlags flags /*= 0*/) : QWidget(parent, flags)
{
	setupUi(this);
	test = new QGraphicsSvgItem(QString::fromUtf8("icons/tga/luftkuehler.svg"));
	scene = new QGraphicsScene(this);
	scene->addItem(test);
	this->graphicsView->setScene(scene);
	//this->graphicsView = new QGraphicsView(scene,parent);
	//this->graphicsView->show();
}


tga_draw_widget::~tga_draw_widget()
{
}



upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

QResource::registerResource("./MOBILA.rcc"); 
QApplication a(argc, argv); 
Tausche die beiden mal gegeneinander aus.
SuperSonik
Beiträge: 69
Registriert: 29. Januar 2007 10:40

Beitrag von SuperSonik »

upsala hat geschrieben:

Code: Alles auswählen

QResource::registerResource("./MOBILA.rcc"); 
QApplication a(argc, argv); 
Tausche die beiden mal gegeneinander aus.
Hatte ich schon gemacht (allerdings eher zufällig).
Ich habe das Programm ein Bisschen geändert. Jetzt wird das ganze durch den Klick auf einen Button ausgelöst. Ich wollte damit die Erzeugung auf jeden Fall nach die Erzeugung der Application legen.

tga_draw_widget.h:

Code: Alles auswählen

#ifndef TGA_DRAW_WIDGET_H_
#define TGA_DRAW_WIDGET_H_

#include "./Ui_tga_draw_widget.h"
#include <QtSvg/QtSvg>
#include <QtGui/QGraphicsScene>


class tga_draw_widget : public QWidget, protected Ui_tga_draw_widget
{
	Q_OBJECT
public:
	tga_draw_widget(QWidget* parent = 0, Qt::WFlags flags = 0);
	virtual ~tga_draw_widget();
private:
	QGraphicsSvgItem *test;
	QGraphicsScene *scene;
public slots:
	void show_tga(void);

};
#endif
tga_draw_widget.cpp:

Code: Alles auswählen

#include "tga_draw_widget.h"
#include <QtSvg/QtSvg>
#include <QtCore/QString>
#include <QtGui/QGraphicsScene>

tga_draw_widget::tga_draw_widget(QWidget* parent /*= 0*/, Qt::WFlags flags /*= 0*/) : QWidget(parent, flags)
{
	setupUi(this);

}


tga_draw_widget::~tga_draw_widget()
{
}

void tga_draw_widget::show_tga()
{
	test = new QGraphicsSvgItem(QString::fromUtf8(":/new/prefix1/icons/tga/luftkuehler.svg"));
	scene = new QGraphicsScene(this);
	scene->addItem(test);
	this->graphicsView->setScene(scene);
}


Geholfen hat das aber leider auch nicht.
Antworten