[solved]Slot in main.cpp

Alles rund um die Programmierung mit Qt
Antworten
Abayo
Beiträge: 25
Registriert: 18. Mai 2013 12:25

[solved]Slot in main.cpp

Beitrag von Abayo »

Hi @ all!

Ich hab eine eventuell dumme Frage, aber ich finde mit Google keine antworten gerade ;)

Kann ich in der main.cpp ein Signal empfangen? Also wie in anderen Klassen eine Funktion "mySignal(int);" in der main.cpp erstellen und diese von einem 2ten Thread aus aufrufen?

Ich möchte nämlich in meiner GUI eine Klasse auf befehl bewegen und skalieren. Diese Klasse erstelle ich in der main und stelle sie dort auch ein (position, usw..). (Ich benutze ein QGraphicsView und Scene btw). Die Skalierung kann ich von der Klasse aus aufrufen mit "this.setScale();", das ist kein Problem. Aber die setPos() funktion, die ich in der main aufrufen kann, kann ich nicht von der Klasse aus selber aufrufen.

hier die main.cpp damit Ihr versteht was ich meine :)

Code: Alles auswählen


#include <QtGui/QApplication>
#include <QtGui/QGraphicsView>
#include <QThread>
#include <QtCore>
#include "speed.h"
#include "kommunikation.h"


#include <QGraphicsSVGItem>
#include <QSvgRenderer>
#include <QGraphicsItem>
#include <QCoreApplication>

#include <QPushButton>

class GraphicsView : public QGraphicsView
{
public:
    GraphicsView(QGraphicsScene *scene) : QGraphicsView(scene)
    {
    }

protected:
    virtual void resizeEvent(QResizeEvent *event)
    {

    }
};

//--------------------------------------------------------------------
//--------------------------------------------------------------------
//--------------------------------------------------------------------

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QThread *thread = new QThread();
    //Kommunikation *worker = new Kommunikation();

    QGraphicsScene scene(-400, -250, 800, 600);

    GraphicsView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);
    view.setBackgroundBrush(QBrush(Qt::black));
    view.setFrameStyle(QFrame::NoFrame);

    //erstellen der Module und einbinden in die Scene
    Speed *speed = new Speed();
    scene.addItem(speed);

//####################################
    QPushButton *button1 = new QPushButton(QString("los"));
    QPushButton *button2 = new QPushButton(QString("design"));
    QObject::connect(button1, SIGNAL(clicked()), speed, SLOT(setSpeedVal()));
    QObject::connect(button2, SIGNAL(clicked()), speed, SLOT(changeDesign()));
    QObject::connect(button2, SIGNAL(clicked()), revolution, SLOT(changeDesign()));

    scene.addWidget(button1);
    scene.addWidget(button2);
    button1->move(-250,-250);
    button2->move(-160,-250);

//####################################
    speed->setPos(-325, -125);

    //scalierung geht über diesen Befehl-> es wird alles der klasse skaliert. Geht auch aus Speed heraus
    //speed->setScale(0.5);

    view.show();

    //worker->moveToThread(thread);

//    //Verbindungen zum laufen lassen/beenden des Kommunikationsthreads
//    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
//    QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
//    QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
//    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

//    thread->start();

    return a.exec();
}


Zuletzt geändert von Abayo am 18. September 2013 13:23, insgesamt 2-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Slot in main.cpp

Beitrag von Christian81 »

Nein und alles in die main zu packen ist extrm schlechter Stil. Bau eine Controller-Klasse in der die einzelnen Instanzen angelegt werden und dann hast Du auch deine Signals/Slots.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Abayo
Beiträge: 25
Registriert: 18. Mai 2013 12:25

Re: Slot in main.cpp

Beitrag von Abayo »

Also praktisch alles was ich in der main angelegt habe einfach in eine neue Klasse MainWindow (oder so) legen und diese Klasse von der main aus aufrufen, oder?
Sollte ich dann den 2ten Thread auch in dieser Klasse machen oder in der main lassen?
die connect aufrufe mache ich dann aber auch in der 2ten klasse, oder?
Sry, wenn ich gerade dumm nachfrage aber ich kann das jetzt gerade nicht nachprüfen und will nur sichergehen :)

EDIT:
Wenn ich das richtig verstehe sollte ich das in etwa folgendermaßen machen:

EIne QGraphicsView in der main erstellen, da diese ja auch angezeigt werden soll mit view.show();
Eine Controllerklasse erstellen die von nichts abgeleitet ist, die View im Aufruf übergeben und dort dann die QGraphicsScene und die weiteren Module erstellen und der view hinzufügen.
Der 2te Thread und die QObject::connect(); aufrufe kann ich weiterhin in der main lassen.

Kommt das in etwa so hin, oder hab ich den Rat falsch verstanden?
Abayo
Beiträge: 25
Registriert: 18. Mai 2013 12:25

Re: Slot in main.cpp

Beitrag von Abayo »

Wie geraten habe ich alles in ein andere Klasse ausgelagert (eine QWidget-Klasse in meinem Fall) und main erstellt nur eine Instanz dieser Klasse und ruft den show-befehl auf.
Funktioniert gut, thx!
Antworten