problemas con mi codigo en c++

Publicado en 'Programación' por Goldberg, 18 Jul 2009.





  1. Goldberg

    Goldberg Miembro nuevo

    Registro:
    17 Jul 2009
    Mensajes:
    2
    Likes:
    0




    Hola a todos!!

    Bueno voy al grano estoy realizando un programa en donde tengo un pixmap el cual se carga en un label para mostrar una imagen, bueno la imagen se muestra sin problemas pero despues modifico la imagen dibujando un rectangulo sobre ella y lo que ahora quiero hacer es volver a cargar la imagen original sin tener que abrirla otra vey desde el el boton abrir y buscarla de nuevo.

    No se si me explico muy bien, tengo una imagen que modifico dibujandole un rectangulo encima, pero si me equivoco al dibujar el rectangulo quiero deshacer los cambios en la imagen, osea que quiero mostrar otra vez la imagen original.

    Estoy trabajando con Qt4 Kdevelop en C++ y bajo Opensuse 11.1
    Soy nuevo en en C++ asi que necesito ayuda !!! les dejo el codigo para que se den una idea, de antemano gracias.


    #include <QXmlStreamWriter>
    #include "design.h"
    #include <stdio.h>
    #include <iostream>
    #include <QFileDialog>
    #include <QtGui>
    #include <QTextEdit>
    #include <QTextStream>
    #include <QTextEdit>
    #include <fstream>
    #include <kimagefilepreview.h>
    #include <kurllabel.h>
    #include <ncurses.h>
    #include <QGraphicsView>
    #include <QInputEvent>
    #include <QEvent>
    #include <QMouseEvent>
    #include <QCursor>
    #include <QImage>
    #include <QPixmap>
    #include <QLineF>
    #include <QPainter>
    #include <QRectF>
    #include<QBrush>
    #include<QPen>
    #include<QPixmapCache>
    using namespace std;




    Design::Design ( QWidget* parent, Qt::WFlags fl )
    : QWidget ( parent, fl ), Ui::CR()
    {
    setupUi ( this );

    // KImageFilePreview pKImageFilePreview = new KImageFilePreview(this);
    // pkImageFilePreview ->setGeometry(QFrame(QFramePrivate &dd, pKImageFilePreview* parent = 0, Qt::WindowFlags f = 0);
    // pKImageFilePreview ->setMinimunSize(630,388);
    // imagePreviewLayout ->addWidget(pKImageFilePreview);






    // To show the windows in the middle of the screen
    //************************************************** *************************************

    QDesktopWidget *desktop = QApplication::desktop();

    int screenWidth, width;
    int screenHeight, height;
    int x, y;
    QSize windowSize;

    screenWidth = desktop->width(); // get width of screen
    screenHeight = desktop->height(); // get height of screen

    windowSize = size(); // size of our application window
    width = windowSize.width();
    height = windowSize.height();

    // little computations
    x = ( screenWidth - width ) / 2;
    y = ( screenHeight - height ) / 2;
    y -= 50;

    // move window to desired coordinates
    move ( x, y );


    //************************************************** *************************************


    //signal and slot conection
    connect ( ButtonBrowse, SIGNAL ( clicked() ), this, SLOT ( ShowImage() ) );
    connect ( ButtonOkSel, SIGNAL ( clicked() ),this , SLOT ( getMouseClicked() ) );
    connect ( ButtonShowSelection, SIGNAL ( clicked() ) ,this, SLOT ( repaint() ) );
    connect ( ButtonCancelChar, SIGNAL ( clicked() ) ,this, SLOT ( update() ) );


    //createActions();//////////////////////////////////////


    }

    Design::~Design()
    {
    }

    /*$SPECIALIZATION$*/
    /*void Design::clicked()
    {

    }*/


    void Design::loadFile ( const QString &fileName )
    {
    QFile file ( fileName );
    QTextStream in ( &file );
    }


    void Design::ShowImage()
    {


    const QString fileName = QFileDialog::getOpenFileName ( this );
    // fileName->setText(fileName);
    // std::cout<<"fileName= "<<fileName<<endl;
    // LabelWidth->setText ( fileName );
    if ( !fileName.isEmpty() )
    loadFile ( fileName );


    ViewCar=QPixmap ( fileName );




    if ( !ViewCar.isNull() )
    {
    LabelPlate->setPixmap ( ViewCar );

    }



    w=ViewCar.width();
    h=ViewCar.height();
    labelw->setNum ( w );
    labelh->setNum ( h );


    }


    /*
    void Design::setPicture(){
    QLabel *LabelIMG;
    QPicture *ViewPlate;
    LabelIMG->setPicture(const View=Plate);
    }*/


    void Design::getMouseClicked()
    {
    // int x=11;
    // int y=250;
    //
    // if (x>10&&y<500){
    // QLineEdit *lineEditChar = new QLineEdit();
    LabelIMG->setText ( "click" );
    //}

    }






    void Design::mousePressEvent ( QMouseEvent* event )
    {



    difX=421/w;
    difY=191/h;

    switch ( event->button() )
    {
    case Qt::LeftButton:

    px1=event->QMouseEvent::x();
    posX1= ( px1-680 ) /difX;
    labelX1Char->setNum ( posX1 );
    py1=event->QMouseEvent::y();
    posY1= ( py1-170 ) /difY;
    labelY1Char->setNum ( posY1 );
    break;
    case Qt::RightButton:

    px2=event->QMouseEvent::x();
    posX2= ( px2-680 ) /difX;
    labelX2Char->setNum ( posX2 );
    py2=event->QMouseEvent::y();
    posY2= ( py2-170 ) /difY;
    labelY2Char->setNum ( posY2 );

    break;
    default:
    LabelIMG->setText ( "hola" );

    }



    width = ( posX2 )- ( posX1 );
    height = ( posY2 )- ( posY1 );
    LabelWidth->setNum ( width );
    LabelHeight->setNum ( height );


    posX11= ( int ) ( posX1 );
    posY11= ( int ) ( posY1 );
    width1= ( int ) ( width );
    height1= ( int ) ( height );




    //QRectF rectangle=QRect(posX1,posY1,width,height);




    //rectangle.setBrush(Qt::SolidPattern);



    //QPainter painter(this);
    //painter.drawEllipse(rectangle);

    }



    void Design::repaint()
    {
    QPainter rectangle;
    rectangle.begin ( &ViewCar );
    QPen pen;
    pen.setColor ( Qt::blue );
    pen.setWidth ( 0.5 );
    rectangle.setPen ( pen );
    rectangle.drawRect ( posX11,posY11,width1,height1 );
    rectangle.fillRect ( posX11,posY11,width,height1,Qt::Dense4Pattern );
    LabelPlate->setPixmap (ViewCar );

    }

    void Design::update() /// *********** con este slot quiero mostrar la imagen otra vez **************************************
    {
    labelX1Char->setNum ( 0 );
    labelY1Char->setNum ( 0 );
    labelX2Char->setNum ( 0 );
    labelY2Char->setNum ( 0 );
    LabelWidth->setText ( 0 );
    LabelHeight->setNum ( 0 );





    // QString fileName = QFileDialog::getOpenFileName ( this );
    // ViewCar=QPixmap ( fileName );
    // LabelPlate->setPixmap ( ViewCar );


    // if ( !fileName.isEmpty() )
    // loadFile ( fileName );

    // ViewCar=QPixmap ( fileName );
    //
    // LabelPlate->setPixmap ( ViewCar );


    }
     


  2. kevin_arthur

    kevin_arthur Suspendido

    Registro:
    21 Set 2008
    Mensajes:
    229
    Likes:
    0
    eres nuevo y ya hces eso??

    wow ....
     
  3. Babyboy03

    Babyboy03 Miembro maestro

    Registro:
    28 Oct 2008
    Mensajes:
    918
    Likes:
    56
    Quien va a ser tan hincha de leerse, entender y corregir tu codigo... bahhhh!!
     
  4. illidan19

    illidan19 Miembro nuevo

    Registro:
    1 Nov 2009
    Mensajes:
    4
    Likes:
    0
    jajaj joder yo ya llebe c++ pero a la profundidac k tas jaja l verda k noce nada jajaj lo uniko k utulise es el conio iostren stdio ingrse a un mal intituto jajaj pero ahora me ponre las pilas me kede kon las gas en c++ viendo estos codigos jaja
     
  5. dokko

    dokko Miembro nuevo

    Registro:
    27 Jul 2009
    Mensajes:
    47
    Likes:
    9
    Suponiendo que la imagen con la que vas a trabajar esta en un archivo o la obtienes realizando varios dibujos; entonces la solucion mas facil pasa por guardar una copia de dicha imagen en la memoria, esta copia no la debes modificar por nada. Asi es como puedes modificar la imagen que tienes en la pantalla cuantas veces quieras, ya sea con un rectangulo o con 1000 rectangulos; y en caso de que quieras mostrar la imagen original, recurres a la copia que esta en la memoria.