Seite 1 von 1

Probleme mit dem Graphics View Framework

Verfasst: 22. November 2007 12:14
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

Verfasst: 22. November 2007 12:21
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.

Verfasst: 22. November 2007 12:30
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.

Verfasst: 22. November 2007 12:52
von DeepDiver
Kannst Du die Sourcen posten?

Dann können wir besser helfen.

CU Tom

Verfasst: 22. November 2007 12:59
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()
{
}




Verfasst: 22. November 2007 19:00
von upsala

Code: Alles auswählen

QResource::registerResource("./MOBILA.rcc"); 
QApplication a(argc, argv); 
Tausche die beiden mal gegeneinander aus.

Verfasst: 22. November 2007 19:52
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.