Übersicht von Thumbnails

Alles rund um die Programmierung mit Qt
Antworten
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

Übersicht von Thumbnails

Beitrag von sacrif »

Hi,

ich möchte auch einigen screenshots eine Thumbnail übersicht machen. Dabei sollen sich die einzelnen Thumbnails anklicken lassen und dann zb. durch einen blauen Rahmen markiert werden(und bei wieder klicken wieder demakiert).
Ich habe dazu auch schon einige Möglichkeiten im Kopf, allerdings bin ich mir nicht so ganz sicher welche in diesem Fall am geeignetsten ist.

Auf der einen Seite habe ich überlegt QLabel zu verwenden da man hier ja auch Pixmaps anzeigen kann. Andererseits, wurde in der docu aber auch erwähnt dass es eigentlich vorrangig zum Anzeigen von Texten gedacht ist.

Darum hab ich mir auch überlegt einfach ein QWidget abzuleiten in dem ich das mein Bild als QImage als member übergebe und dann ähnlich wie in diesem Artikel darstelle:
http://www.informit.com/articles/articl ... 1&seqNum=3

Code: Alles auswählen

    QImage image(size(), QImage::Format_ARGB32_Premultiplied);
    QPainter imagePainter(&image);
    imagePainter.initFrom(this);
    imagePainter.setRenderHint(QPainter::Antialiasing, true);
    imagePainter.eraseRect(rect());
    draw(&imagePainter);
    imagePainter.end();

    QPainter widgetPainter(this);
    widgetPainter.drawImage(0, 0, image);
Da in meinem Fall auch eine genaue Darstellung des Thumbnails nicht ganz unwichtig ist habe ich auch eher an die zweite Variante gedacht (nachdem die laut Artikel zumindest sehr genau ist). Allerdings Frage ich mich ob QLabel nicht ebenso eine sehr gute Qualität hat und ob man im Thumbnails überhaupt so einen großen Unterschied erkennt.

Wäre dankbar für Tips was ihr bevorzugen würdet. Bzw. zur Qualität von QLabel - bildern.
Außerdem: Wenn ich eine Blauen Rahmen um das Bild erstellen will: Mit welcher der Lösungen wäre es leichter zu bewerkstellingen? Und wäre es bei QLabel möglich den blauen Rahmen beim anklicken dazuzuzeichnen ohne die Klasse abzuleiten, bzw. könnte es überhaupt auf ein event reagieren ohne dass man die Klasse Ableitet und umschreibt?

thx & lg scr
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

mittels QLabel kannst du problemlos alle bilder anzeigen und die qualitaet bestimmst du denke ich dabei selbst.

wenn du das ganze markieren willst macht evtl. aber doch eine eigene klasse sinn (dann kannst du im paint event ggf. den rahmen zeichnen).

oder du nimmst ein QGraphicsPixmapItem fuer jedes bild und setzt QGraphicsItem::ItemIsSelectable (so oder aehnlich heisst das flag) true, dann kannst du es via click markieren.
das ganze muesstest du dann eben in einer QGraphicsScene anordnen wie du es gerne haettest und via QGraphicsView anzeigen lassen.
ich weiss nicht, was fuer dich nun sinnvoller ist, bzw. was genau du noch alles vorhast.

mfg,
julian
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

Beitrag von sacrif »

Ich habe jetzt daweil die Variante genommen, dass ich eine Klasse erstellt habe die von einem QWidget abgeleitet ist und ein QImage als Member hat.

Ich habe die Objekte dieser Klasse erstellt und in einem vector gespeichert. Dann habe ich sie in einer Groupbox zum dazugehörigen layout mittels ->addwidget(objekt) geadded. Und dannach von jedem objekt die update Methode aufgerufen. Allerdings springt das Program einfach nicht in die paintEvent Methode hinein und ich verstehe nicht ganz warum.


Der Code dazu ist hier:
ImageWidget ist die klasse in der das QImage als widget dargestellt werden soll.

Code: Alles auswählen

void MyParentWidget::createThumbnailWidgets()
{
for(unsigned int i = 0; i < numberOfThumbnails; i++)
{
	ImageWidget* currentImageWidget = new ImageWidget(*(thumbnails_[i]);
	thumbnailVector_.push_back(currentImageWidget);
}
}

Code: Alles auswählen

void MyParentWidget::displayThumbnailWidgets()
{
	for(unsigned int i = 0; i < thumbnailVector_.size(); i++)
	{
		thumbnailGroupLayout_->addWidget(thumbnailVector_[i]);
	}

	for(unsigned int i = 0; i < thumbnailVector_.size(); i++)
	{
		thumbnailVector_[i]->update();
	}
}
Und trotz dem update zuvor kommt das program niemals in das paintEvent. Gibts da Ideen dazu?

Code: Alles auswählen

void ImageWidget::paintEvent( QPaintEvent *event )
{
    QPainter widgetPainter(this);
    widgetPainter.drawImage(0, 0, widgetImage_); //widgetImage ist das QImage
}
Und hier noch die Groupbox die ich im konstruktor von MyParentWidget erstelle:

Code: Alles auswählen

...
        thumbnailGroup_ = new QGroupBox();
	thumbnailGroup_->setTitle("Thumbnails");
	thumbnailGroupLayout_ = new QVBoxLayout(thumbnailGroup_);
	mainLayout->addWidget(thumbnailGroup_);
...
Das Program schein die ImageWIdgets zu erstellen und auch das QImage richtig zu übergeben, aber warum wird update nicht aufgerufen?

Danke für den support!

lg

EDIT:
Problem gelöst, mit repaint() statt update funktionierts.
Antworten