QMainWindow im Designer erstellt... und nun?

Verschiedenes zu Qt
Antworten
streen
Beiträge: 3
Registriert: 20. November 2008 12:48

QMainWindow im Designer erstellt... und nun?

Beitrag von streen »

Hallo,

Ich befasse mich leider erst seit kurzem mit QT, habe hauptsächlich in bereits vorhandenen Projekten gedebuggt und Funktionalitäten hinzugefügt. Jetzt sollte ich allerding ein neues kleines Tool bauen, also fix den QT Designer gezückt ein schönes Main-Window-UI zusammengebastelt und das ganze in VS 2008 per Pre-Build Event im vorraus erzeugen lassen. Klappt soweit wunderbar.
Jetzt hab ich nur zwei grundlegende Probleme/Fragen:
Da ich die UI von der Funktionalität eigendlich trennen will müssen ja die Signale irgendwie aus dem Main Window raus kommen. Wie stelle ich das an? Wie man am code unten sieht erzeuge ich ein QMainWindow dass ich mit meinem UI fülle. ich müsste doch jetzt noch irgendwie im UI Signale erzeugen, die ich dann in einer neuen Klasse (nur mal als Gedankenspiel StitchProcess) per Slots wieder abfangen kann prozessieren und dann wieder elemente der UI setzten (wie einen Process bar). Oder habe ich da einen generellen Denkfehler?

Die andere Frage ist, ich habe ein weiteres Widget erstellt, mit einem Label einer Spin Box und einem Slider. Dieses Widget will ich jetzt wiederum in mein Main Window UI einsetzten, ich habe zwar schon gelesen, dass es geht, nur das wie ist mir leider noch nicht ganz klar.

Ich hoffe ich konnte meine Probleme einigermaßen klar darstellen.
Ich habe zwar schon dierse Seiten durchwühlt, aber der Groschen ist leider noch nicht gefallen.

*winke*

Edit: Narg ... in dem Fred: http://qtforum.de/forum/viewtopic.php?t=7869 scheint mein zweites Problem behandelt zu werden. :-)
Edit2: Okay mit dem zweiten Problem bin ich etwas weiter gekommen, aber leider noch nicht weit genug. Ich habe mir im Designer auf folgenden weg ein neues Widget gebastelt: neu -> Widget. Danach habe ich das Widget mit einen Label, einer SpinBox und einem Slider gefüllt. den Slider mit der Spinbox und andersherum verbunden. Jetzt muss ich nur zum Initalisierungszeitpunkt 4 Parameter festlegen: Name des labels, Min/Max Werte und Start wert des Spinners bzw. Sliders. So langsam habe ich das gefühl dass der Designer hier an seine Grenzen kommt, un ich zwar jetzt fürs erste mir die h/cpp files erstellen lassen kann, nur jetzt das ganze per Hand machen muss. (Ausser ich kann einen "Prozessor" definieren, der auf die Parameter zugreifen kann.)
Des weiteren ist auch noch das Problem, dass ich da noch Fehlermeldungen bekomme:
error C2143: syntax error : missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Das ganze an der flogenden Stelle:

Code: Alles auswählen

....#include <spinboxslidercombowidget.h>

QT_BEGIN_NAMESPACE

class Ui_StitchGui
{
public:
    ...
    SpinBoxSliderComboWidget *mTemplateCountContainerFrame;
    SpinBoxSliderComboWidget *mTemplateSizeContainerFrame;
    SpinBoxSliderComboWidget *mTemplateMatchingYBorderContainerFrame;
Das Widget wird nicht gefunden... (Alles durch uic erzeugt, also noch nicht selber reingepfuscht. Wenn ich jetzt per Hand das auf Ui::SpinBoxSliderComboWidget ändere, findet er an der Stelle zwar die klasse, findet dann aber einige Funktionen wie setObjectName/setGeometry nicht. Scheinbar ist SpinBoxSliderComboWidget nicht von QWidget vererbt, was ich eigendlich erwaret hätte. Bin da etwas verwirrt was der Designer anstellt.


(Der Main App Code)

Code: Alles auswählen

#include <qt/qapplication.h>
#include "StitchGui.h"

int main( int argc, char* argv[] )
{
  QApplication app( argc, argv );
  QMainWindow *mainWindow = new QMainWindow();
  Ui::StitchGui stitchGui;
  stitchGui.setupUi(mainWindow);
  mainWindow->show();
  int ret = app.exec();
  return ret;
}
streen
Beiträge: 3
Registriert: 20. November 2008 12:48

Beitrag von streen »

So ich habe jetzt schon so gut wie alle Probleme behoben. Nur mein "Unterwidget" bekomme ich noch nicht korrket angezeigt.

Ich habe jetzt zwei Ui Files: ein GuiInterface und ein SpinBoxSliderInterface
von denen leite ich jeweils eine Klasse Gui und SpinBoxSlider ab. Im Designer habe ich den spinboxslider als benuzerdefiniertes widget angegeben und 6 frames erzeugt die als Platzhalter dienen sollen. also nicht den im Designer erstellten UI sondern seine Ableitung.

Im Main erzeuge ich eine Gui und starte diese. Die Gui wird gestartet (vorher natürlich auch ohne Probleme kompiliert) aber die SpinBoxSlider Nicht angezeigt... Mir stellt sich jetzt die Frage warum. Wenn bei der Erzeugung durch das uic schon Fehler auftreten sollten, also die SpinBoxSlider nicht entdeckt werden sollte es doch schon da Probleme geben.

Hier der Quellcode von SpinBoxSlider, ich musste auch noch mal von QFrame ableiten, da ich sonst die COmbobox nicht mit übergeben konnte, ich dachte eigendlich dass das Interface eigendlich schon von QFrame abgeleitet sein sollte. bin da etwas verwirrt.

Code: Alles auswählen

#include "SpinBoxSliderComboFrameInterface.h"
#include "Qt/QFrame.h"

class SpinBoxSliderComboFrame : public Ui::SpinBoxSliderComboFrameInterface, public QFrame
{
    // Constructors
public:
    SpinBoxSliderComboFrame(QWidget* parent);
    ~SpinBoxSliderComboFrame(void);
Im anhang noch der Auszug aus dem Designer
Dateianhänge
Designer.JPG
Designer.JPG (75.13 KiB) 1556 mal betrachtet
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

hmm.. wo soll ich beginnen.. am Besten bei den Unklarheiten und möglichen Irrtümern:

Punkt 1: Warum von Ui::XY UND QWidget erben:
Deine Klasse Ui::SpinBoxSliderComboFrameInterface ist kein Widget (kein Frame, keine Form, kein Dialog oder wie immer du das nennen möchtest). Diese Klasse kann nur ein Widget "aufsetzten"/"initialisieren". Wie das genau funktioniert und warum das so ist steht unter: http://doc.trolltech.com/4.4/designer-u ... onent.html

Punkt 2: QFrame
Ich verstehe noch nicht, warum du von einem "QFrame" schreibst.. kann es sein, dass du den Fenstertitel "Frame - xyz" als "QFrame" interpretierst? Ich glaube eher, du hast über den Menüpunkt "new" ein neues "Widget" erstellt... also ein QWidget... Unter Linux wird dort der Titel "Form" angegeben.. deswegen ist es aber noch immer ein QWidget
:wink:

Punkt 3: SpinBoxSliderCombo nicht sichtbar..
Leider hast du bisher viel zuwenig Code gezeigt.. daher kann ich nur raten: hast du evt. (wie unter http://doc.trolltech.com/4.4/designer-u ... e-approach) beschrieben) das "setupUi()" im Konstruktor vergessen?
Beachte ausserdem, dass Qt bei Fehler häufig entsprechende Meldungen auf der Konsole ausgibt... nicht alle Fehler können zur Compilezeit erkannt werden..

Punkt 4: Tipp: SpinBoxSlider als Qt-Plugin
Falls du dieses neue Element häufiger brauchst, solltest du dir überlegen, wie unter http://doc.trolltech.com/4.4/plugins-howto.html beschrieben dein "SpinBoxSlider" als Extension zu entwerfen.. dann kannst du dein Slider wie alle "normalen" Qt-Widgets im Designer platzieren, hast dadurch eine saubere Vorschau und eine hübsche Konfiguration (Property-Editor).

hth...
Antworten