QT action als Visual Studio plugin vs QT Creator
-
Hallo,
ich habe mich an ein paar Tutorials zuerst über das Visual Studio plugin probiert
und bin dann hier hängengeblieben...Dort wird eine actionNew_Window von dem Designer generiert,
diese Generierung ist über den QT Designer als VS plugin nicht möglich.Also habe ich die on_actionNew_Window methode per Hand in meinen Code
geschrieben, das hat aber nicht funktioniert, die Methode feuert nie.Dann habe ich das ganze über QT Creator probiert und es hat gefunzt.
Nun ist meine Frage, was man noch beachten muss unter VS,
um die action zum Laufen zu bekommen...Vielen Dank
Rahul
-
Ist die Frage blöd gestellt oder weiß das einfach keiner?
-
Die eigentliche Beschreibung ist ein 10-minütiges Video, zu dem wohl niemand Lust hat. Die Beschreibung deines Vorgehens enthält nichts greifbares - außer "Mein Versuch ist gescheitert"

Am besten du erklärst erstmal, was dieses "actionNew_Window" ist/macht, dann wie du es versucht hast, und wenn es nicht geklappt hat eine PRÄZISE Fehlermeldung (Compiler/Consolenausgabe usw.). Alles am besten mit Code.
-
Falls das ein Slot ist, muss der noch verbunden werden. Das kannst Du im QT-Designer auch machen, ohne dass die Methode dort implementiert ist. Oder Du kannst es selbst im Code machen.
-
Okay, danke für die Antworten...
Aber ich hatte halt geglaubt, dass wenn jemand nicht weiß,
was eine QAction ist, er mir ohnehin nicht helfen kann,
weil er über dieses spezifische Problem mit Visual Studio nicht gestolpert ist.Es ist kein SIGNAL/SLOT-Mechanismus. Mehr ein weiteres Event-Handling,
das mir eine Wiederverwendung von den Aktionen erlaubt, wenn z.B. verschiedene
Knöpfe die gleiche Aktion ausführen sollen(siehe http://developer.qt.nokia.com/doc/qt-4.8/qaction.html#details)Meine Klasse schaut so aus:
"myclass.hpp"
#ifndef MYCLASS_H #define MYCLASS_H #include <QtGui/QMainWindow> #include "ui_myclass.h" class MyClass : public QMainWindow { Q_OBJECT public: MyClass(QWidget *parent = 0, Qt::WFlags flags = 0); ~MyClass(); void on_actionNew_Window_triggered(); void on_actionNew_Test_triggered(); private: Ui::MyClassClass * ui; }; #endif // MYCLASS_H"myclass.cpp"
#include "myclass.h" MyClass::MyClass(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags), ui( new Ui::MyClassClass ) { ui->setupUi(this); this->setCentralWidget( ui->plainTextEdit ); } MyClass::~MyClass() { delete ui; ui = 0; } void MyClass::on_actionNew_Window_triggered() { ui->plainTextEdit->setPlainText("Hello QT World\n"); } // on_actionNew_Window_triggered void MyClass::on_actionNew_Test_triggered() { ui->plainTextEdit->setPlainText("Hello QT World Test\n"); } // on_actionNew_Test_triggeredBilder kann ich nicht hoch laden, aber meine Form sieht ungefähr so aus,
wie in dem Video ab 1:30-1:50, es fehlt nur die plainTextEdit im Zentrum
und noch eine Menüoption Test...ALs Fehler kommt gar nischt, ich kann einfach die Menüoption auswählen
oder das Icon in der Toolbar drücken und passiert nichts...Das verwunderliche ist ja, dass das ganze klappt, wenn ich die Form und den Code mit dem QCreator ausführe und der Code sieht nicht anders aus.
Deswegen ist meine Frage, ob noch etwas für den Präpräcompiler bei QT
zu berücksichtigen ist.Vielen Dank
Rahul
-
Also, ohne SIGNAL/SLOT geht da sowieso nichts. Die beiden Funktionen müssen schon SLOTS sein. Bei dir fehlt dann auch noch ein connect.
Eine QAction feuert ein triggered()-SIGNAL. WIllst du darauf reagieren MUSST du einen SLOT dranhängen. Nach der Benennung deiner Funktion zu schließen, solltest du auch mal lesen, was bei QMetaObject::connectSlotsByName() steht. (setupUi sollte das automatisch aufrufen, pass aber auf die Namen deiner Objekte und Slots auf)
-
Oh, jetzt schäme ich mich ein wenig für meine Dummheit,
bzw dafür dass ich nicht erkannt habe, dass die Actions auch mit SIGNAL/SLOT-Mechanismus funzen...Ich weiß aber nicht, worauf du mit dem QMetaObject-Hinweis hinauswillst.
Der sieht bei mir so aus:QMetaObject::connectSlotsByName(MyClassClass);Ich habe den Konstruktor jetzt mit connects so angepasst und das funzt:
MyClass::MyClass(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags), ui( new Ui::MyClassClass ) { ui->setupUi(this); this->setCentralWidget( ui->plainTextEdit ); connect( this->ui->actionNew_Window, SIGNAL( triggered() ), this , SLOT ( on_actionNew_Window_triggered() ) ); connect( this->ui->actionNew_Test, SIGNAL( triggered() ), this , SLOT ( on_actionNew_Test_triggered() ) ); }Aber vielen Dank so weit...
-
Meine Vermutung, wieso das beim QTCreator klappt und in Visual Studio nicht, ist, dass er beim QT Creator basierend auf dem Namen automatisch die Signal/Slots erzeugt (vermutlich in der angesprochenen Meta-Methode). In Visual Studio ist die vielleicht anders aufgebaut und akzeptiert die Syntax nicht automatisch. Deswegen werden besagte Signal/Slots dort nicht automatisch erzeugt.
Zumindest ne Vermutung...