QDesigner dialog.ui manuell manipuliert

Alles rund um die Programmierung mit Qt
Antworten
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

QDesigner dialog.ui manuell manipuliert

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QDesigner dialog.ui manuell manipuliert

Beitrag 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?
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag 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
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag 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!
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag 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.
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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).
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

gelöst

Beitrag 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!
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag 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!
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag 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?
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Schau mal hier, das visual studio addIn!
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag 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..
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag 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!
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Beitrag von huckleberry »

Das Widget selbst ist in reiner myUi.ui Form. Das Widget greift dann aber auf die *.ddl's zu..
Antworten