Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    34

    [C++/Qt]Alcuni chiarimenti sul MVC

    Ciao a tutti mi sto avvicinando alla programmazione con le librerie grafiche QT.
    Ho già programmato in java e qualcosisa in VC++. ora vorrei creare una piccola interfaccia grafica per testare un programma che ho fatto.
    Allora io ho usato il Qt Creator e ho disegnato la mia interfaccia grafica con alcuni bottoni a questo punto ho aggiunto gli eventi cliccando col destro e poi "Go to slot..." e selezionando cliccked in modo da collegare gli eventi (come in visual studio per capirci) e quindi ho creato la mia classe view chiamata fantasiosamente "MainWindows" poi ho creato la mia classe model/controller chiamata "Centrale" e al click dei bottoni volevo richiamare questi dei metodi di questa classe ma credo che ci sia qualcosa che mi sfugga su come funziona il paradigma MVC con le qt di seguito vi posto il codice:
    mainwindow.h
    codice:
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include "Centrale.h"
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
        
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        void update();
        
    private slots:
        void on_ButtonConnect_clicked();
    
        void on_buttonInserisci_clicked();
    
        void on_buttonDisinserisci_clicked();
    
        void on_buttonIncludi_clicked();
    
        void on_buttonEscludi_clicked();
    
    private:
        Ui::MainWindow *ui;
        Centrale cent;
    };
    
    #endif // MAINWINDOW_H
    mainwindow.cpp
    codice:
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <iostream>
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        cent = new Centrale(70000);
        ui->setupUi(this);
        connect(ui->actionExit,SIGNAL(triggered()),this, SLOT(close()));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::update()
    {
        if ((cent.zones[0] & 0x01) == 0x01){
            ui->zonaa_1->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->zonaa_1->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[1] & 0x01) == 0x01){
            ui->zonaa_2->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->zonaa_2->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[2] & 0x01) == 0x01){
            ui->zonaa_3->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->zonaa_3->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[3] & 0x01) == 0x01){
            ui->zonaa_4->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->zonaa_4->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[4] & 0x01) == 0x01){
            ui->zonaa_5->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->zonaa_5->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[5] & 0x01) == 0x01){
            ui->zonaa_6->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->zonaa_6->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[0] & 0x02) == 0x02){
            ui->zonai_1->setStyleSheet("QLabel { background-color: blue }");
        }else{
            ui->zonai_1->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[1] & 0x02) == 0x02){
            ui->zonai_2->setStyleSheet("QLabel { background-color: blue }");
        }else{
            ui->zonai_2->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[2] & 0x02) == 0x02){
            ui->zonai_3->setStyleSheet("QLabel { background-color: blue }");
        }else{
            ui->zonai_3->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[3] & 0x02) == 0x02){
            ui->zonai_4->setStyleSheet("QLabel { background-color: blue }");
        }else{
            ui->zonai_4->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[4] & 0x02) == 0x02){
            ui->zonai_5->setStyleSheet("QLabel { background-color: blue }");
        }else{
            ui->zonai_5->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.zones[5] & 0x02) == 0x02){
            ui->zonai_6->setStyleSheet("QLabel { background-color: blue }");
        }else{
            ui->zonai_6->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.partizioni[0] & 0x01) == 0x01){
            ui->area_1->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->area_1->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.partizioni[1] & 0x01) == 0x01){
            ui->area_2->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->area_2->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.partizioni[2] & 0x01) == 0x01){
            ui->area_3->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->area_3->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.partizioni[3] & 0x01) == 0x01){
            ui->area_4->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->area_4->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.centrale & 0x01) == 0x01){
            ui->acstate_3->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->acstate_3->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.centrale & 0x02) == 0x02){
            ui->acstate->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->acstate->setStyleSheet("QLabel { background-color: green }");
        }
        if ((cent.centrale &0x04) == 0x04){
            ui->acstate_2->setStyleSheet("QLabel { background-color: red }");
        }else{
            ui->acstate_2->setStyleSheet("QLabel { background-color: green }");
        }
    }
    
    void MainWindow::on_ButtonConnect_clicked()
    {
        cent = new Centrale(8655);
    }
    Centrale.h
    codice:
    #ifndef CENTRALE_H
    #define CENTRALE_H
    
    #include "mainwindow.h"
    
    typedef struct Comandi_struct{
        int comando;
        int elemento;
    }Comandi;
    
    class Centrale
    {
    private:
        long id;
        QWidget *finestra;
        Comandi comandi[10];
        int n_comandi;
    public:
        int zones[6];
        int partizioni[4];
        int centrale;
    public:
        Centrale();
        Centrale(long ce_id);
        void inserisci(int n);
        void disinserisci(int n);
        void includi(int n);
        void escludi(int n);
    private:
        void * client(void);
        static void * run(void *arg) {return ((Centrale *)arg)->client();}
        void creaPacchetto(unsigned char * pacchetto,int comando, int elemento);
        unsigned short crcUpdate4(unsigned char *buffer, unsigned int len, unsigned short crc);
    };
    #endif // CENTRALE_H
    Per diverse ragioni non posso postarvi purtroppo il centrale.cpp
    Ora le mie domande sono:
    • oltre agli "eventi" cliccked sui bottoni devo aggiungere le connect anche nel costruttore della finestra? Perchè?
    • è più o meno giusto il modo in cui ho strutturato il programma?
    • vorrei che la classe centrale o che comunque un timer chiamasse il metodo update della classe mainwindow ma non so come fare


    Scusate se possono sembrare banali ma non ho trovato un buon tutorial sulle Qt ho trovato quella della nokia ma non riesco a capire.
    Grazie
    Ciao

  2. #2
    Una volta che clicchi sul pulsante non fai altro che invocare un metodo pubblico della classe centrale. Vedo però che la classe centrale la crei 2 volte. Riesci a postare un esempio sintetico?

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    34
    Grazie non mi ero accorto dell'errore.
    Un problema l'ho risolto
    Allora il comportamento dell'applicazione dovrebbe essere questo.
    Al click sul pulsante connetti la mia applicazione crea un istanza della classe Centrale. A questo punto la classe centrale lancia un thread che si connette ad un server tramite socket e aggiorna lo stato dei vettori zone partizioni e centrale (lo so che avrei dovuto creare dei metodi per non rendere disponibili direttamente quelle variabili ma sono pigro ) nel mentre vorrei che ogni tot di tempo o comunque al cambio di una delle variabili venisse invocato il metodo update della mainwindow
    Spero di essere stato abbastanza chiaro.

    Per gli "eventi" allora sono giusto infatti era come pensavo grazie ora il problema è proprio l'invocazione del metodo update

  4. #4
    Un thread può comunicare con un form per mezzo di connection. Prova a scaricare questo
    http://kde-apps.org/content/show.php/?content=149622
    Nei sorgenti trovi un thread che comunica con una form. Ciao ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.