Seite 1 von 1
Frage zu Thumbnails
Verfasst: 25. März 2008 16:34
von NoRulez
Hey @all,
ich würde gerne realisieren das ich wie bei der Miniaturansicht mehrere kleine thumbnails nebeneinander und untereinandere darstellen kann.
da man ja ein Bild über QLabel (QPixmap) darstellen kann soweit auch kein problem. Mein Problem fängt da, da ich nicht weiß worauf ich die bilder darstellen soll, damit scrollbars zur verfügung stellen.
Meine Idee war ein Widget zu erstellen und darauf ein QGridLayout, indem die Bilder/QLabel's eingebettet sind. Nur wollte ich fragen ob man sowas auf solche art macht, oder ob man das eleganter lösen sollte/kann.
Lg NoRulez
Verfasst: 25. März 2008 16:51
von FlorianBecker
Hallo,
ich würde ein FlowLayout nehmen, dort kannst du dann deine QLabel's mit Pixmaps darstellen. Durch das FlowLayout werden automatisch die passende Anzahl der Widgets in der Breite dargestellt. Dazu gibt es in der Qt Bibliothek ein Beispiel und das ganze setzt du in eine QScrollArea, damit du automatisch eine ScrollBar hast.
Vielleicht geht es noch eleganter?
Viel Erfolg damit.
Verfasst: 25. März 2008 17:03
von NoRulez
Danke vielmals für die schnelle Antwort, werde ich dann am abend gleich mal probieren.
Lg NoRulez
Verfasst: 25. März 2008 20:00
von NoRulez
Also ich habe jetzt folgendes probiert:
Code: Alles auswählen
QScrollArea *scroll_area = new QScrollArea;
w_images = new QWidget(scroll_area);
flow = new FlowLayout(w_images);
// flow = new QGridLayout(w_images);
QHBoxLayout *vbox = new QHBoxLayout(centralWidget);
dir_tree = new QTreeWidget;
QSplitter *splitter = new QSplitter(Qt::Horizontal);
splitter->addWidget(dir_tree);
splitter->addWidget(scroll_area);
vbox->addWidget(splitter);
centralWidget->setLayout(vbox);
connect(dir_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(itemClicked(QTreeWidgetItem*, int)));
und dann in einem andere SLOT:
Code: Alles auswählen
QDir dir(filename);
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Size | QDir::Reversed);
int row = 0, col = 0;
QFileInfoList list = dir.entryInfoList();
for(int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
if(fileInfo.isDir()) {
}
else {
QLabel *label = new QLabel;
label->setPixmap(QPixmap(fileInfo.absoluteFilePath()));
//flow->addItem(label);
flow->addWidget(label);
QMessageBox::information(this, "Item Clicked", fileInfo.absoluteFilePath());
}
}
Mir wird zwar die MessageBox mit dem richtigen Dateinamen angezeigt, aber ich glaube das die QLabels übereinander liegen. ich habe es auch mal mit QPushButton probiert, jedoch sehe ich da keine Scrollbars.
Die Bilder werden weiters in der Größe ca. 100x20 angezeigt das es nicht das komplette bild angezeigt wird. normalerweise wäre ein bild beispielsweise 150x100 groß.
Hoffe um Hilfe
Lg NoRulez
PS: Bei einem QGridLayout sehe ich überhaupt nichts und auch keine Scrollbar. als FlowLayout habe ich
http://doc.trolltech.com/4.3/layouts-flowlayout.html genommen
Verfasst: 25. März 2008 20:06
von SchranZViruS
Du solltest setWidget() bei deiner QScrollArea benutzen, da dieses Widget dann zum scrollen ist, die Area als parent zu benutzen geht, soweit ich weiß, nicht.
Dadurch könnten auch deine abgeschnittenen Bilder bzw. Labels herkommen, weil er versucht, das ganze in den zur Verfügung stehenden Platz zu zwengen, ohne zu scrollen.
Verfasst: 25. März 2008 20:14
von NoRulez
ok,
also ich habe jetzt folgendes hinzugefügt:
Also insgesamt wie folgt für den ersten code abschnitt:
Code: Alles auswählen
QScrollArea *scroll_area = new QScrollArea;
w_images = new QWidget(scroll_area);
scroll_area->setWidget(w_images); /// <------ INSERTED
flow = new FlowLayout(w_images);
// flow = new QGridLayout(w_images);
QHBoxLayout *vbox = new QHBoxLayout(centralWidget);
dir_tree = new QTreeWidget;
QSplitter *splitter = new QSplitter(Qt::Horizontal);
splitter->addWidget(dir_tree);
splitter->addWidget(scroll_area);
vbox->addWidget(splitter);
centralWidget->setLayout(vbox);
connect(dir_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(itemClicked(QTreeWidgetItem*, int)));
Nur sehe ich jetzt gar nichts

was mache ich bloss falsch?
Lg NoRulez
Verfasst: 25. März 2008 20:19
von NoRulez
ok, also nun funktioniert es, habe folgendes gefunden:
http://www.qtcentre.org/forum/f-qt-prog ... -3778.html
Nun sieht es wie folgt aus, falls jemand dasselbe Problem hat:
Code: Alles auswählen
QScrollArea *scroll_area = new QScrollArea;
w_images = new QWidget(scroll_area);
scroll_area->setWidget(w_images); /// <------ INSERTED
flow = new FlowLayout(w_images);
// flow = new QGridLayout(w_images);
QHBoxLayout *vbox = new QHBoxLayout(centralWidget);
dir_tree = new QTreeWidget;
QSplitter *splitter = new QSplitter(Qt::Horizontal);
splitter->addWidget(dir_tree);
splitter->addWidget(scroll_area);
vbox->addWidget(splitter);
centralWidget->setLayout(vbox);
connect(dir_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(itemClicked(QTreeWidgetItem*, int)));
wird ersetzt durch:
Code: Alles auswählen
this->flow = new FlowLayout;
this->flow->setSizeConstraint(QLayout::SetMinimumSize);
scroll_area = new QScrollArea;
scroll_area->setLayout(this->flow);
QHBoxLayout *vbox = new QHBoxLayout(centralWidget);
dir_tree = new QTreeWidget;
QSplitter *splitter = new QSplitter(Qt::Horizontal);
splitter->addWidget(dir_tree);
splitter->addWidget(scroll_area);
vbox->addWidget(splitter);
centralWidget->setLayout(vbox);
connect(dir_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(itemClicked(QTreeWidgetItem*, int)));
Vielen Dank an alle
Lg NoRulez