Seite 1 von 1

QLabel neues Bild per Button zuweisen

Verfasst: 9. November 2009 19:59
von whammy
Hallo!

Folgendes habe ich vor: Ein Bild wird bei Programmstart automatisch geladen und soll dann per Knopfdruck invertiert werden.
Nur kriege ich nicht hin, dass das invertierte Bild dann auch angezeigt wird. Da ich per connect ja keine Parameter übergeben kann habe ich dann die Klasse newpic() geschrieben die erstmal einfach nur das invertierte Bild anzeigen soll.
Rufe ich sie nicht über das connect auf funktioniert alles, nur wenn ich den Slot mit dem Button verbinden will nicht.

Wo liegt da mein Denkfehler?

Code: Alles auswählen

#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QWidget>
#include <QPixmap>
#include <QString>
#include <QLabel>
#include <QImage>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

class MyLabel : public QLabel
{
public slots:
    void newpic();
};

void MyLabel::newpic()
{
	QImage *Pic3 = new QImage;
	Pic3->load("/home/example.jpg");
	Pic3->invertPixels();
	setPixmap(QPixmap::fromImage(*Pic3));
	update();		
}

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *quit = new QPushButton(tr("Quit"));
    quit->setFont(QFont("Times", 18, QFont::Bold));
    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));

	QImage *Pic = new QImage;
	Pic->load("/home/example.jpg");

	MyLabel *lbl = new MyLabel;
	lbl->setPixmap(QPixmap::fromImage(*Pic));

	QPushButton *bttload = new QPushButton(tr("Load Image"));
       QPushButton *bttinvert = new QPushButton(tr("Invert Image"));
	connect(bttinvert, SIGNAL(clicked()), lbl, SLOT(newpic()));

	QVBoxLayout *buttons = new QVBoxLayout;
	buttons->addWidget(bttload);
	buttons->addWidget(bttinvert);

	QHBoxLayout *picture = new QHBoxLayout;
	picture->addLayout(buttons);
	picture->addWidget(lbl);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(quit);
    layout->addLayout(picture);
    setLayout(layout);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

Re: QLabel neues Bild per Button zuweisen

Verfasst: 9. November 2009 20:31
von Troll.Soft
whammy hat geschrieben: Da ich per connect ja keine Parameter übergeben kann
Wo liegt da mein Denkfehler?
Hallo,
warum kannst Du im connect keine Parameter übergeben?
Viele Signale unter Qt haben Parameter.

habe unten mal einen kurzen Beispielcode ohne connect :)

Code: Alles auswählen

#include <QtCore>
#include <QtGui>

int main	( int Argc, char ** Argv ) 
{
    QApplication App(Argc, Argv);

	QImage Image("L:/images/frau.jpg");

	QLabel* Label = new QLabel;
	Label->setPixmap(QPixmap::fromImage(Image));
	Label->show();

	QPushButton* PushButton = new QPushButton;
	Image.invertPixels();
	PushButton->setIcon(QPixmap::fromImage(Image));
	PushButton->show();

	return App.exec();
}

Verfasst: 9. November 2009 21:39
von whammy
Und wie übergebe ich es als connect?
Ich bin gerne auch für andere Lösungsansätze offen wie ich per Knopfdruck verschiedene Bilder anzeigen lassen kann!

Gruß, whammy

Verfasst: 9. November 2009 22:03
von solarix
Der Fehler liegt da drin:

Code: Alles auswählen

class MyLabel : public QLabel
{
public slots:
    void newpic();
};

Die Lösung steht in der Doku.. einfach gut durchlesen: http://doc.trolltech.com/4.5/signalsand ... ll-example

Nebenbei bemerkt: in newpic() produzierst du Memory-Leaks..

Verfasst: 10. November 2009 07:53
von Troll.Soft
whammy hat geschrieben: Und wie übergebe ich es als connect?

Code: Alles auswählen

connect( myClass, SIGNAL( my_signal ( const QPixmap& ) ), this, SLOT( mySlot ( const QPixmap& ) ) ); 
Du emittierst ein Signal my_signal in der KLasse myClass und im slot mySlot kommt das Pixmap angeflitzt.
tschüß
Trollsoft

P.S.: ein kurzer oder auch längerer Blick in die Doku betreffend Signals and Slots kann tatsächlich nicht schaden. Und achte darauf, das Du bei den Signalen keine Parameternamen angibst.