Search code examples
qtviewmodelsignalsslots

Qt Model and View - Link data from model to view, how?


I'm pretty new to the Model and View concept and I'm having trouble finding the right way to do this. So in my understanding the concept means, that I have one class that handles all the view (GUI) parts and an other class which handles the data processing.

The GUI I made has a few Display Widgets (LCDnumbers) which just have to get data from the other class and output it into the LCD. So I made a function in the GUI class which can set a number into the LCD. And I've made a function which can change the value of the number in the data class. Now I need something to connect those, for example when I change the number in the data class I want it to update in the GUI. I found somethings about Signals and Slots (and emitting a signal) but how does that work, while maintaining the Model and View concept?

It could be that this is answered somewhere else, if so, can you link me the source? I couldn't find anything to solve my problem. Thanks for reading and I hope someone can help me.

Header file of the GUI:

#include <QMainWindow>
#include <QtCore>
namespace Ui {
class MainBoardView;
}

class MainBoardView : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainBoardView(QWidget *parent = 0);
    ~MainBoardView();
    void ChangeNumber(int value);   
private:
    Ui::MainBoardView *ui;

};

CPP file of the GUI:

#include "mainboardview.h"
#include "ui_mainboardview.h"

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

}

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

void MainBoardView::ChangeNumber(int value)
{
    ui->lcdNumber->display(value);
}

Code of the data class:

Header:

class MainBoard
{
public:
    MainBoard();
    void changeMoney(int value);
private:
    int m_money;
}

CPP:

void MainBoard::ChangeMoney(int value)
{
    m_money = value;
    //emit a signal here with the value to the ChangeNumber function of the GUI?
   //and how should I do this?

}

Solution

  • For applying model/view concept of Qt you should use at least one of a model classes. Such model classes provide unified interface for several types of data (string-list, trees, sql, etc.)

    For displaying the data one would use either a view-class or widgets connected to the model via QDataWidgetMaper

    In your case there is no use of model/view observable. MainBoard should be QObject for emitting the signal:

    class MainBoard: public QObject
    {
      Q_OBJECT
    public:
        MainBoard();
        void changeMoney(int value); //emit value with emit moneyChanged(value) in the implementation.
    signals:
        void moneyChanged(int)
    private:
        int m_money;
    }