Seite 1 von 1

[solved]Slot in main.cpp

Verfasst: 1. September 2013 11:19
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();
}



Re: Slot in main.cpp

Verfasst: 1. September 2013 12:30
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.

Re: Slot in main.cpp

Verfasst: 1. September 2013 18:24
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?

Re: Slot in main.cpp

Verfasst: 18. September 2013 13:21
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!