2016-04-04 7 views
2

Ich verwende Qt 5.5.1. Ich habe eine MainWindow, die manuell mit dem Code erstellt wird. Es hat eine QListWidget und QStackedWidget. Außerdem habe ich 5 Widgets mit *.ui Dateien in Form-Design. Das Problem ist, dass ich nicht weiß, wie Felder für Objekte in Formularen von MainWindow.cpp festgelegt werden.Einstellen von UI-Objekten mit vielen Widgets

Hier sind die ersten Zeilen von pages.h:

#include <QWidget> 

namespace Ui 
{ 
    class settings; 
    class textCreating; 
    class databasework; 
    class AutoMode; 
    class ManualMode; 
} 

class settings : public QWidget 
{ 
    Q_OBJECT 
public: 
    settings(QWidget *parent = 0); 
    ~settings(); 
    static Ui::settings *ui; //It was private and not static at first 
private: 
}; 

//other classes// 
//...// 

Und in pages.cpp:

settings::settings(QWidget *parent) : QWidget(parent), ui(new Ui::settings) 
{ 
    ui->setupUi(this); 
} 

Und mainwindow.cpp:

MainWindow::MainWindow() 
{ 
    //code here// 

    settings::ui->firstAddedParamLabel->setVisible(true); 
} 

Also, wenn ich kompilieren, bekomme ich:

error: 'Ui::settings* settings::ui' is a static data member; it can only be initialized at its definition settings::settings(QWidget *parent) : QWidget(parent), ui(new Ui::settings)

Und es zeigt auf ui(new Ui::settings). Meine Frage ist, wie man UI Felder einstellt/erhält? kann ich nicht vollständig verstehen. Vielen Dank!

+1

Was möchten Sie erreichen, indem Sie es öffentlich und statisch machen, vielleicht gibt es einen anderen Weg, um das gleiche zu erreichen – Apin

+0

Ich konnte nicht private Mitglied Ui :: Einstellungen in MainWindow zum Beispiel verwenden. Also habe ich es öffentlich gemacht. Danach habe ich eine Fehlermeldung, die besagt, dass ich keine statischen Member Ui :: settings einstellen kann. –

+0

Warum versuchen Sie, 'Ui :: settings' von 'MainWindow' zu manipulieren? – thuga

Antwort

2

Ihr "UI" Mitglied sollte nicht statisch sein. Aus welchem ​​Grund hast du dich dafür entschieden? Sie könnten es sogar als einfache Klasse scoped Mitglied verwenden, wie:

#include <QWidget>  
#include "ui_settings.h" 

class settings : public QWidget 
{ 
    Q_OBJECT 

public: 
    settings(QWidget* parent) : QWidget(parent) 
    {// move this to cpp... 
    ui.setupUi(this); 
    } 
    virtual ~settings(); 

public: 
    Ui::settings ui; 
}; 

Und, es zu benutzen, können Sie einfach fügen Sie es als Mitglied Ihrer Mainwindow-Klasse.

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    MainWindow(QWidget* parent) 
    { 
    _settings = new settings(this); 
    setCentralWidget(_settings); // You may also add it somewhere else in your layout, of course. 

    _settings->ui.firstAddedParamLabel->setVisible(true); 
    } 

private: 
    settings* _settings; 
}; 

Ich persönlich glaube nicht, dass es sehr schön ist, die gesamte Ui::settings Klasse als öffentlich verfügbar zu machen. Ich würde auch empfehlen, einen sauberen Code-Stil zu behalten und Camel-Case-typisierte und robustere Klassennamen korrekt zu verwenden.

z.B .: settings =>SettingsWidget und für die erzeugte UI-Klasse vielleicht: ui::settings =>Ui::SettingsWidgetForm

Dies macht es einfacher, den Unterschied zu halten zwischen generierten und selbst geschriebenen Klassen.

+0

Ich habe es getan, weil ich einen Fehler habe: ungültige Verwendung von nicht-statischen Daten Mitglied 'Einstellungen :: Ui' Ui :: Einstellungen * Ui; –

+0

Siehe mein Update über die Verwendung in Ihrem MainWindow, bitte :-) – mfreiholz

+0

Nicht sicher, ob ich es richtig gemacht habe ... Also sollte ich den Konstruktor der Klasse in den Header verschieben? Und dann alle Hauptfenster Mitglieder in Konstruktor setzen? Mein Gehirn tut weh ... Außerdem benutze ich es in main.cpp: Settings settings; QObject * saveConfig = sets.findChild ("saveSetupsButton"); –

0

Wenn Sie es wirklich statisch machen wollen, können Sie unten probieren:

In Ihrem page.cpp:

Ui::settings *settings::ui = 0; 
settings::settings(QWidget *parent) : QWidget(parent), ui(new Ui::settings) 
{ 
    ui->setupUi(this); 
} 

Oder wenn obige Code nicht, versuchen Sie unten funktioniert:

Ui::settings *settings::ui = new Ui::settings; 
settings::settings(QWidget *parent) : QWidget(parent) 
{ 
    ui->setupUi(this); 
} 

Und meine Frage ist immer noch, warum willst du es statisch machen? Was willst du eigentlich erreichen? Wenn Sie die Benutzeroberfläche bearbeiten möchten, sollten Sie dies innerhalb Ihres Einstellungswidgets tun. Dies ist keine gute Übung. Wenn Sie etwas falsch auf Ihrer Benutzeroberfläche finden, ist es schwer zu finden, weil alles in der Lage ist, es zu manipulieren.