Frage zu Thumbnails

Alles rund um die Programmierung mit Qt
Antworten
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Frage zu Thumbnails

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Danke vielmals für die schnelle Antwort, werde ich dann am abend gleich mal probieren.

Lg NoRulez
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag 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
SchranZViruS
Beiträge: 31
Registriert: 3. Februar 2008 01:33

Beitrag 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.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

ok,

also ich habe jetzt folgendes hinzugefügt:

Code: Alles auswählen

scroll_area->setWidget(w_images);
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
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

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