QLabel neues Bild per Button zuweisen

Alles rund um die Programmierung mit Qt
Antworten
whammy
Beiträge: 2
Registriert: 9. November 2009 19:23

QLabel neues Bild per Button zuweisen

Beitrag 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();
}
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Re: QLabel neues Bild per Button zuweisen

Beitrag 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();
}
whammy
Beiträge: 2
Registriert: 9. November 2009 19:23

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag 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.
Antworten