PDA

Visualizza la versione completa : [C++] Errori di compilazione su Qt Creator


iamwill
18-05-2012, 20:34
Ciao a tutti,
ho da fare un piccolo problema...Ossia quello di creare un'interfaccia grafica che mi legga un'immagine e la visualizzi (poi a questa applicare un algoritmo).

Allora avevo pensato ad una cosa semplice fatta di 3 tasti (load, run ed exit) e un'area di visualizzazione delle immagini.

Il problema che ho a disposizione solo lo strumento di QtCreator e delle OpenCv...

Ho scritto qualcosa, ma non capisco perch mi da sempre nuovi errori nella compilazione.
Qualcuno potrebbe aiutarmi? Pi che altro so che Qt non molto diffuso quindi so che dura trovare qualcosa :dh: :dh:

Who am I
18-05-2012, 22:28
Saper correggere l' errore senza vedere il codice sarebbe impossibile.

Scara95
19-05-2012, 13:25
Qt non molto diffuso? una fra le librerie grafiche pi usate...
KDE scritto in qt, meego e maemo pure, la nokia lo usa per le sue applicazioni e molte applicazioni multipiattaforma lo usano come toolkit...

iamwill
21-05-2012, 02:09
Scusate non volevo farvi arrabbiare... solo che nessuno dei miei amici che fa un lavoro nel campo dell'informatica aveva mai n lavorato n sentito parlare di Qt: ecco perch pensavo fosse sconosciuto...

Allora provo a mettere il codice prima di scrivere gli errori che mi vengono fuori.

Main.cpp


#include <QtGui/QApplication>
#include "esempio.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}



Esempio.cpp


#include <QtGui>
#include "esempio.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect (ui->actionExit,SIGNAL(triggered()),this,SLOT(close())) ;
imageLabel = new QLabel;
child = new QLabel(0);
}

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

void MainWindow::on_actionOpen_triggered()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open File"), QDir::currentPath());
if (!fileName.isEmpty()) {
QImage image(fileName);

child->setPixmap(fileName);
ui->mdiArea->addSubWindow(child);
child->show();
if (image.isNull()) {
QMessageBox::information(this, tr("Image Viewer"),
tr("Cannot load %1.").arg(fileName));
return;

}
imageLabel->setPixmap(QPixmap::fromImage(image));
scaleFactor = 1.0;
}
}

void MainWindow::on_actionZoom_In_triggered()
{
scaleImage(1.25);
}

void MainWindow::on_actionZoom_Out_triggered()
{
scaleImage(0.8);
}

void MainWindow::on_actionNormal_size_triggered()
{
imageLabel->adjustSize();
scaleFactor = 1.0;
}

void MainWindow::scaleImage(double factor)
{
Q_ASSERT(imageLabel->pixmap());
scaleFactor *= factor;
imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());

zoomInAct->setEnabled(scaleFactor < 3.0);
zoomOutAct->setEnabled(scaleFactor > 0.333);
}



Esempio.h


#ifndef ESEMPIO_H
#define ESEMPIO_H

#include <QMainWindow>

class QLabel;
class QAction;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void on_actionOpen_triggered();

void on_actionZoom_In_triggered();

void on_actionZoom_Out_triggered();

void on_actionNormal_size_triggered();

private:
Ui::MainWindow *ui;
QLabel *imageLabel;
void scaleImage(double factor);

double scaleFactor;

QAction *zoomInAct;
QAction *zoomOutAct;
};

#endif // ESEMPIO_H



In pratica sono riuscito fino ad ora a risolvere parecchi errori, ma non capisco perch mi dice che non ho dichiarato il "child"

Il child da quello che ho studiato una istanza di QLabel, quindi in che maniera dovrei specificarla?

A me viene l'interfaccia con i comandi, ma non riesco a far visualizzare nella mdiArea le foto che vorrei proprio per il motivo detto sopra...



PS: una volta fatta questa cosa, secondo voi come potrei passare a far visualizzare 40 immagini con uno standard predefinito? Si passa facile da 1 a 40 immagini?


Grazie in anticipo a chi mi pu dare uno spunto

Scara95
21-05-2012, 07:14
In esempio.cpp
In MainWindow::MainWindow
Ultima riga...
Non mi sembra tu abbia mai dichiarato child...
Poi non capisco il giochetto che fai coi namespace...

iamwill
21-05-2012, 13:09
scusami ma non ho capito che intendi...child da quel che so serve per visualizzare le immagini

forse dovrei mettere nell' header


QLabel *child; ??


namespace a dire il vero mi compare da solo appena inizializzo il project e lo lascio li senza toccare nulla...dovrei cancellare il tutto?

iamwill
21-05-2012, 13:17
C:\Users\Seven\esempio-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\..\esempio\esempio.cpp:28: error: 'class Ui::MainWindow' has no member named 'mdiArea'



provato a fare come dicevo e questo sopra un nuovo errore...uff non ne esco pi :bh:



edit: risolto anche questo...(parzialmente ahim :confused: :confused: )
Ora il problema capire perch non mi compare nella mdiArea la mia immagine,ma si viene a creare una piccola finestra di Qt...
In realt per me fondamentale che venga nell'Area perch successivamente dovrei fare la segmentazione ad un'immagine che carico e non a pi immagini contemporaneamete...Idee?

ecco cosa mi viene fuori:

http://i47.tinypic.com/2vuyl2t.jpg

Scara95
21-05-2012, 16:21
Leggi affondo questa pagina e quelle linkate questa (http://qt-project.org/doc/qt-4.8/qt4-mainwindow.html): tutto ti apparir pi chiaro, inoltre mentre scrivi il programma tienila sott'occhio.

Qui (http://qt-project.org/doc/qt-4.8/tutorials.html) ci sono i tutorial passo-passo ufficiali e qui (http://qt-project.org/doc/qt-4.8/all-examples.html) gli esempi di codice con descrizione.

Ti consiglio di leggere bene gli esempi (ovviamente quelli dell'argomento a cui sei interessato) inquanto puoi ricavarne spunti e chiarimenti, in ogni caso prima devi assolutamente aver letto la documentazione (che ti ho linkato all'inizio).

Ciao :)

iamwill
21-05-2012, 16:42
ok grazie mille Scara...Legger un p il tutto :ciauz: :ciauz:

MegaAlchimista
24-05-2012, 17:56
Ti apre la nuova finestra perch tu hai inserito un nuovo oggetto nella mdiArea, che un "contenitore" per finestre, qualsiasi widget aggiunto viene inserito in una subwindow.
Da quello che ho capito riguardo il tuo problema, io credo che tu debba sostituire la tua mdiArea con un semplice frame, poi da codice inserire in questo il tuo label con l'immagine ed applicare un layout.
Ultimo chiarimento: child letteralmente significa figlio. Sono child di un ogetto tutti gli ogetti creati in quell'ogetto (per esempio una dialog aperta in mainwindow child di mainwindow). Se tu scrivi

Child = new *Qlabel
Il compilatore pensa che child sia il nome di un oggetto (che non hai mai dichiarato da nessuna parte) e che debba assegnargli come valore quello contenuto nell'indirizzo di una nuova istanza di qlabel, e giustamente ti da errore. Se vuoi creare un puntatore ad un label figlio della tua mainwindow, e vuoi chiamarlo child devi scrivere

QLabel *child = new QLabel(this)

Loading