Seite 1 von 1

QDesigner dialog.ui manuell manipuliert

Verfasst: 14. Juni 2011 13:19
von huckleberry
Hallo Foristen,

ich habe in meinem Projekt eine myUI.ui. Diese erzeugt ein MyUi.h. Das HBoxLayout und das Button habe ich im nachhinein manuell selbst hinzugefügt (das GridLayout hat schon die ersten 5 Plätze (0-4) belegt mit anderen Widgets):

Code: Alles auswählen

//
QT_BEGIN_NAMESPACE

class Ui_DockWidget
{
public:
    QWidget *dockWidgetContents;
    QGridLayout *gridLayout;
	QHBoxLayout	*btnLO;
    QPushButton *myButton;
    QTableView *myTV;

    void setupUi(QDockWidget *DockWidget)
    {
        DockWidget->resize(400, 380);
        dockWidgetContents = new QWidget();
        dockWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents"));
        gridLayout = new QGridLayout(dockWidgetContents);
        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));

  /// hier mal an 3. Stelle
        myTV = new QTableView(dockWidgetContents);
 gridLayout->addWidget(myTV, 2, 0, 1, 1);

		myButton	= new QPushButton(QString::fromUtf8("MyButton"));

		//myButton->setObjectName(QString::fromUtf8("myButton"));

		btnLO = new QHBoxLayout;
		btnLO->addWidget(myButton);
        gridLayout->addItem(btnLO, 5, 0, 1, 1);
    		
        DockWidget->setWidget(dockWidgetContents);
	
		retranslateUi(DockWidget);

        QMetaObject::connectSlotsByName(DockWidget);
    } // setupUi

    void retranslateUi(QDockWidget *DockWidget)
    {
        DockWidget->setWindowTitle(QApplication::translate("DockWidget", "MyInterface", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(DockWidget);
    } // retranslateUi

};

namespace Ui {
    class DockWidget: public Ui_DockWidget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // MY_UI_H
Diese wird hier verwednet HEADER:

Code: Alles auswählen

#ifndef THISCLASS_H
#define THISCLASS_H

#include <myUi.h>

class ThisClass
    : public QDockWidget
    , public Ui_DockWidget
{
    Q_OBJECT

    public:
	//..
und SOURCE:

Code: Alles auswählen

#include "ThisClass.h"
#include "mydialog.h"

/// @relevance{Demo}
ThisClass::ThisClass( QWidget *myParent )
        : QDockWidget( myParent )
        , myUIDockWidget()
{
    setupUi(this);

    setParent(myParent);

	//...code
	
    connect( myButton,	SIGNAL(clicked(bool)),	 this, SLOT(doThis()));
	
	//..
}
Also in der Zeile mit

Code: Alles auswählen

    connect( myButton,		SIGNAL(clicked(bool)),					this, SLOT(doThis()));
findet er myButton nicht :( Mit dieser Fehlermeldung:
3>Compiling...
3>ThisClass.cpp
3>M:\Eigene Dateien\project\ThisClass.cpp(77) : error C2065: 'mybutton' : undeclared identifier
Was mache ich falsch? Darf ich die *.ui nicht manuell manipilieren? Zb wurde die TableView myTB nicht von mir manipuliert, diese wird auch erkannt.

Vielen Dank!
Gruß Huck

Re: QDesigner dialog.ui manuell manipuliert

Verfasst: 14. Juni 2011 13:34
von franzf
huckleberry hat geschrieben:Was mache ich falsch? Darf ich die *.ui nicht manuell manipilieren?
Was steht in dem ui_*.h drüber?
** WARNING! All changes made in this file will be lost when recompiling UI file!
Frage erübrigt?

Verfasst: 14. Juni 2011 13:58
von huckleberry
Jupp, ich danke! Habs glatt überlesen.

Ich haber nun die myUi.ui aus dem Solution Explorer entfernt, sodass eine Neu-Kompilalation verhindert wird.

Habe aber noch eine Frage diesbezüglich: Einemal die myUi.h generiert bräuchte ich doch die myUi.ui nicht mehr? Oder gehen mir irgendwelche Compiler-Infos künftig verloren, welche ich kontinuierlich aus der ui beziehe? Eigentlich nicht, oder? Denn alle Infos wurden ja am Anfang in die myUi.h gepackt.

Ich würde ab jetzt nur noch in der myUi.h rumwurschteln.

Vielen Dank und Mfg huck

Verfasst: 14. Juni 2011 14:57
von Mani99
Du machst es mit gewalt kompliziert, oder?

An der ui datei solltest du gar nichts ändern, lass sie einfach! Änderungen kannst du über den pointer der von der aufrufenden klasse erzeugt wird vornehmen!

Verfasst: 14. Juni 2011 15:16
von huckleberry
Mani99 hat geschrieben:Änderungen kannst du über den pointer der von der aufrufenden klasse erzeugt wird vornehmen!
Okey, aber zB das QPushButton existiert in der myUI.ui noch gar nicht.

Verfasst: 14. Juni 2011 15:26
von Mani99
huckleberry hat geschrieben:
Mani99 hat geschrieben:Änderungen kannst du über den pointer der von der aufrufenden klasse erzeugt wird vornehmen!
Okey, aber zB das QPushButton existiert in der myUI.ui noch gar nicht.
Was willst du überhaupt bezwecken? Wenn du eine programmoberfläche erstellen willst, dann nimm den designer. Wenn du zu der erstellen oberfläche (ui file) etwas hinzufügen/entfernen/ändern willst, dann greif über den pointer darauf zu!

Um welchen QPushButton gehts überhaupt?

Verfasst: 14. Juni 2011 15:26
von franzf
huckleberry hat geschrieben:Okey, aber zB das QPushButton existiert in der myUI.ui noch gar nicht.
Das sollte doch total wurscht sein! Die ui verwendest du normalerweise in Verbindung mit einer eigenen Widget-klasse. Der Member "Ui_MeinWidget" sollte eh private sein, oder du hast schon private von der ui-klasse geerbt. Niemand außer der Klasse hat Zugriff auf den Member, da kannst du doch die zusätzlich in die ui eingefügten Widgets/Layouts/... neben dem ui in der Klasse als Member speichern.

Ansonsten:
Das .ui nicht löschen, sondern speichern, wenn du wie oben neue Widgets usw. hinzufügen willst machst du das .ui mit dem Designer auf, bastelst alles zusammen, speicherst es ab, drückst auf "kompilieren" und "ausführen" und deine Gui ist verändert. Es sollte eigentlich zu keinem Zeitpunkt nötig sein, in eigenem Code das .ui zu verändern (Ausnahmen bestätigen die Regel).

gelöst

Verfasst: 15. Juni 2011 10:11
von huckleberry
Mani99 hat geschrieben:Änderungen kannst du über den pointer der von der aufrufenden klasse erzeugt wird vornehmen!
Vielen Dank für die Anregung, darauf bin ich nicht gekommen. Auf jeden Fall habe ich es nun so realisiert.
Mani99 hat geschrieben: Was willst du überhaupt bezwecken? Wenn du eine programmoberfläche erstellen willst, dann nimm den designer. Wenn du zu der erstellen oberfläche (ui file) etwas hinzufügen/entfernen/ändern willst, dann greif über den pointer darauf zu!
Also das Widget wurde schon vom Hersteller erstellt, und ich habe nur Visual Studio und kein QtDesigner. Die ui kann ich mit VS soweit ich weiss nicht bearbeiten. Das Widget hat Grundfunktionen, welche ich nun erweitern möchte.

Danke für alle Hinweise!

Verfasst: 15. Juni 2011 10:31
von Mani99
und ich habe nur Visual Studio und kein QtDesigner.
Ich bin mir fast sicher, das bei dem visual studio addIn ein designer dabei ist, der direkt in visual studio angezeigt werden kann.
Das Widget hat Grundfunktionen, welche ich nun erweitern möchte.
Das widget hat auf alle fälle auch eine klasse dahinter, in der der ui header eingebunden ist, und diese stellt vermutlich einen zeiger auf "ui" zur verfügung!

Verfasst: 15. Juni 2011 14:42
von huckleberry
Mani99 hat geschrieben:Ich bin mir fast sicher, das bei dem visual studio addIn ein designer dabei ist, der direkt in visual studio angezeigt werden kann.
Ich habe das addId, nicht installiert. Es werden nur Qt-Klassenbibliotheken benutzt. Visual Studio hat als einziges AddIN das AnkhSVN.

Es sei denn, das addIn gehört immer zu VS dabei und ich muss es nur aktivieren oder so?

Verfasst: 15. Juni 2011 14:52
von Mani99
Schau mal hier, das visual studio addIn!

Verfasst: 15. Juni 2011 15:20
von huckleberry
Ich trau mich nicht ganz es zu installieren, ist nämlich die aktuelle Version 4.7.0.

Die *.dll's vom Hersteller die ich benötige, die haben irgendwelche Qt-Pfade für 4.5.0 hart mit einkodiert. Somit ist eine dynamische Konfiguration der jeweiligen Qt Version kaum möglich. Ergo es läuft nur mit 4.5.0.

Mein System läuft grad einwandfrei, ich habe angst mir irgendwelche Pfade o.ä. zu zerschiessen ;) Ich werd das installieren, wenn die das mal korrigieren..

Verfasst: 15. Juni 2011 15:34
von Mani99
Ok, musst du selber wissen ob das änderst oder nicht.

Wegen widget bearbeiten, in welcher form liegt das widget vor? Wenn das widget als dll vorliegt, hast du sowieso ein problem mit dem bearbeiten!

Verfasst: 15. Juni 2011 15:50
von huckleberry
Das Widget selbst ist in reiner myUi.ui Form. Das Widget greift dann aber auf die *.ddl's zu..