2017-03-27 2 views
0

Mit meiner Anwendung, die ich mit C++ und QT entwickeln, versuche ich den Zustand der GUI mit Bildern und Widgets vom Benutzer importiert, so dass, wenn die Benutzer beendet und die Anwendung startet erneut, es ist genau dort, wo der Benutzer aufgehört hat mit den Bildern und Widgets, die genau an der Stelle gespeichert sind, an der der Benutzer sie platziert hat.Speichern der GUI mit importierten Bildern in QLabel gespeichert in QT

Die Bilder werden in den QLabels gespeichert. Ich habe versucht, den QSettings-Beispielcode zu verwenden, den ich gesehen habe, aber er funktioniert überhaupt nicht. Ideen zum Speichern des gesamten GUI-Status, wobei der Benutzer Widgets und Bilder direkt importieren kann. Cheers :)

hier ist meine Quellcode von dem, was ich

bisher entwickelt haben
#include "MainWindow.h" 
#include "ui_MainWindow.h" 
#include <QMessageBox> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    // Load state of GUI 
    read_settings(); 
    ui->setupUi(this); 

    // Set up the window size 
    this->setWindowTitle(QString::fromUtf8("Raspberry PI GUI v1.0")); 
    this->resize(800, 400); 

    //------------------------------------------- 
    // Setting up buttons on the main screen 
    //------------------------------------------- 
    // Add label 
    button = new QPushButton("Add Graphic", this); 
    button->setGeometry(QRect(QPoint(10, 20), QSize(200, 50))); 
    button->show(); 

    // Add LED 
    button = new QPushButton("Add LCD", this); 
    button->setGeometry(QRect(QPoint(10, 80), QSize(200, 50))); 
    button->show(); 
    QObject::connect(button, &QPushButton::clicked, this, &MainWindow::input_led); 

    // Add Next Window 
    button = new QPushButton("New Window", this); 
    button->setGeometry(QRect(QPoint(10, 140), QSize(200, 50))); 
    button->show(); 
    //QObject::connect(button, SIGNAL(pressed()), this, SLOT(input_newwindow())); 
    QObject::connect(button, &QPushButton::clicked, this, &MainWindow::input_newwindow); 

    // Add plot 
    button = new QPushButton("Add Plot", this); 
    button->setGeometry(QRect(QPoint(10, 200), QSize(200, 50))); 
    button->show(); 
    QObject::connect(button, &QPushButton::clicked, this, &MainWindow::input_plot); 

} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 


void MainWindow::close_event(QCloseEvent *event) 
{ 
    write_settings(); 
    event->accept(); 
} 

void MainWindow::write_settings() 
{ 
    QSettings settings("reaffer Soft", "reafferApp"); 

    settings.beginGroup("MainWindow"); 
    settings.setValue("size", size()); 
    settings.setValue("pos", pos()); 
    settings.endGroup(); 
} 

void MainWindow::read_settings() 
{ 
    QSettings settings("reaffer Soft", "reafferApp"); 

    settings.beginGroup("MainWindow"); 
    resize(settings.value("size", QSize(800, 400)).toSize()); 
    move(settings.value("pos", QPoint(200, 200)).toPoint()); 
    settings.endGroup(); 
} 


void MainWindow::input_label() 
{ 
    Label *label = new Label(this); 
    label->setText("New Graphic"); 
    label->show(); 
} 

void MainWindow::input_led() 
{ 
    LED *led = new LED(this); 
    led->show(); 
} 

void MainWindow::input_newwindow() 
{ 
    this->hide(); 
    QMainWindow *newwindow = new QMainWindow(); 
    newwindow->resize(800, 400); 
    newwindow->show(); 


    // Need to set up and get working correctly 
    // Back button 
    QPushButton *back_button = new QPushButton(newwindow); 
    back_button->setText("Back"); 
    back_button->setGeometry(QRect(QPoint(10, 80), QSize(200, 50))); 
    back_button->show(); 
    QObject::connect(back_button, &QPushButton::pressed, newwindow, &QMainWindow::hide); 
    // Need to go back to previous screen 
    this->show(); 


    // Forward button 
    QPushButton *forward_button = new QPushButton(newwindow); 
    forward_button->setText("Next"); 
    forward_button->setGeometry(QRect(QPoint(50, 140), QSize(200, 50))); 
    forward_button->show(); 
    // Create a new screen 
    QObject::connect(forward_button, &QPushButton::pressed, this, &QMainWindow::show); 
    this->hide(); 

} 

void MainWindow::input_plot() 
{ 
    QMainWindow *windowplot = new QMainWindow(); 
    windowplot->resize(800, 400); 
    windowplot->show(); 
} 

void MainWindow::ButtonClicked() 
{ 

} 

Antwort

0

Wo sparen Sie tatsächlich den Zustand Ihrer benutzerdefinierten Widgets? Ich sehe nur, dass Sie speichern und laden Sie die Position und Größe des Hauptfensters selbst, nicht seine Kinder !? Btw können Sie die Grundposition und Größe mit QWidget::saveGeometry() speichern und laden Sie es mit QWidget::restoreGeometry und den Status der Symbolleiste und Dock-Widgets von QMainWindow mit QMainWindow::saveState und laden Sie es mit QMainWindow::restoreState bzw..

Wenn Sie die Position und Bildpfad Ihrer benutzerdefinierten Etiketten zu speichern, verwenden Sie einfach einen ähnlichen Ansatz wie folgt aus:

QSettings settings("MyCompany", "MyApp"); 
settings.beginGroup("label1"); // your widget id 
settings.setValue("geometry", label1->saveGeometry()); 
settings.setValue("imagePath", label1->text()); // or wherever you save the image 
settings.endGroup(); 

Das ist eine dest meine einfache Idee, wie Ihr Problem zu lösen, für mehr Details Ihr Bedürfnis, mehr Infos zur Verfügung zu stellen.

0

Ok jetzt verstehe ich, dass ich nur versucht, die Position und Größe des Hauptfensters selbst zu laden und nicht seine Kinderposition zu speichern.

Ich bin immer noch auf der Seite der Speicherung der Position des Speicherns der Position und Bildpfad der benutzerdefinierten Etiketten mit dem Lese-/Schreib-QSettings-Code fest. Ich denke, ich habe den Schreibeinstellungen richtig, aber nicht die Leseeinstellungen.

void MainWindow::write_settings() 
{ 
    QSettings settings("reaffer Soft", "reafferApp"); 

    settings.beginGroup("MainWindow"); 
    settings.setValue("size", size()); 
    settings.setValue("pos", pos()); 
    settings.setValue("label", label->saveGeometry()); // Save label size 
    settings.setValue("imagePath" label->size()); // Save the image loaded 
    settings.endGroup(); 

    qDebug() << "Write Settings"; 

} 

Zum Importieren der Bilder auf die Etiketten verwende ich eine andere cpp-Datei. Der Code dafür ist unten gezeigt.

Label.cpp

#include "label.h" 


//--------------------------------------- 
// Deconstructor 
//--------------------------------------- 
Label::~Label() 
{ 

} 


void Label::mousePressEvent(QMouseEvent *event) 
{ 
    // Move the coordinates on the main window 
    m_nMouseClick_X_Coordinate = event->x(); 
    m_nMouseClick_Y_Coordinate = event->y(); 
} 

void Label::mouseMoveEvent(QMouseEvent *event) 
{ 
    //------------------------------------------------------------- 
    // Allow the user to drag the graphics on the Display 
    //------------------------------------------------------------- 
    move(event->globalX()-m_nMouseClick_X_Coordinate-m_pParentWidget->geometry().x(), 

     event->globalY()-m_nMouseClick_Y_Coordinate-m_pParentWidget->geometry().y()); 
} 

void Label::mouseDoubleClickEvent(QMouseEvent *event) 
{ 
    //-------------------------------- 
    // Open file dialog 
    //-------------------------------- 
    QFileDialog dialog(this); 
    dialog.setNameFilter(tr("Images(*.png, *.dxf, *.jpg")); 
    dialog.setViewMode(QFileDialog::Detail); 
    QString fileName = QFileDialog::getOpenFileName(this, 
     tr("Open Images"), 
     "/home", 
     tr("Image Files (*.png *.jpg *.bmp)")); 

    if (!fileName.isEmpty()) 
    { 
     QImage image(fileName); 
     Label::setPixmap(fileName); 
     Label::adjustSize(); 
    } 
} 
+0

Erste, was Sie tun sollten, den Pfad zu Ihrem Image-Datei in Ihrem Label irgendwo sparen, wenn Sie zu empfehlen nicht die ganze pixmap auf die Einstellungen speichern möchten (nicht). Was ist das 'Label :: setPixmap (fileName);', sieht aus wie eine statische Methode in Ihrer 'Label' Klasse? extrahieren Sie trotzdem die Methode, um das Bild in Ihr Label zu laden, damit Sie es wiederverwenden können, wenn Sie die Einstellungen laden und wenn Sie es doppelklicken, um es zum ersten Mal zu laden. – xander