2017-03-27 9 views
0

C++ 및 QT로 개발중인 응용 프로그램에서 사용자가 가져온 이미지와 위젯이있는 GUI의 상태를 저장하려고합니다. 사용자가 종료하고 응용 프로그램이 다시 시작되면 사용자가 배치 한 동일한 위치에 정확히 저장된 이미지와 위젯으로 사용자가 중단 한 부분입니다.QT에서 QLabel에 저장된 가져온 이미지로 GUI 상태 저장

이미지는 QLabels에 저장됩니다. 내가 본 QSettings 예제 코드를 사용하려고했지만 전혀 작동하지 않습니다. 사용자가 위젯과 이미지를 직접 가져올 수있는 전체 GUI 상태를 저장하는 방법에 대한 아이디어. 건배 :) 여기

는 지금까지

#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() 
{ 

} 

답변

0

개발 한 것을 내 소스 코드 어디 실제로 사용자 정의 위젯의 상태를 저장합니까이야? 나는 단지 당신이 주 창 자체의 위치와 크기를 적재하고 아이들을 적재하지 않는다는 것을 안다!? 기본 위치와 크기를 QWidget::saveGeometry()으로 저장하고 QWidget::restoreGeometry 및 도구 모음 및 도킹 위젯 상태를 QMainWindow에서 QMainWindow::saveState으로로드하고 각각 QMainWindow::restoreState으로로드하십시오.

당신은 이런 유사한 접근 사용, 사용자 정의 라벨의 위치와 이미지 경로를 저장하려면 다음과 이상, 당신의 문제를 해결하는 방법에 적어도 내 간단한 아이디어가

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(); 

을 더 많은 정보를 제공 할 필요성에 대해 자세히 설명합니다.

0

이제는 주 창 자체의 위치와 크기를로드하고 자녀 위치를 저장하지 않으려 고합니다.

읽기/쓰기 QSettings 코드를 사용하여 맞춤 라벨의 위치와 이미지 경로를 저장하는 위치를 저장하는 부분에 여전히 중점을두고 있습니다. 필자는 쓰기 설정 코드가 올바르지 만 읽기 설정이 아니라고 생각합니다.

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"; 

} 

레이블로 이미지를 가져 오는 경우 다른 cpp 파일을 사용하고 있습니다. 그 코드는 아래와 같습니다.

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

먼저 당신이해야 할 것은 당신이 설정으로 전체 픽스맵을 저장하지 않으려면 권장하지 않습니다 (어딘가 레이블에 이미지 파일의 경로를 저장입니다). 이'Label :: setPixmap (fileName);'은'Label' 클래스의 정적 메소드처럼 보입니까? 어쨌든 레이블에 이미지를로드하는 방법을 추출하여 설정을로드 할 때 다시 사용할 수 있고 처음 두 번 클릭하여로드 할 때 다시 사용할 수 있습니다. – xander