QFileDialog mit Bild Preview

Alles rund um die Programmierung mit Qt
Antworten
SkyperHH
Beiträge: 5
Registriert: 29. April 2009 14:38
Wohnort: Hamburg

QFileDialog mit Bild Preview

Beitrag von SkyperHH »

Hallo,

ich bin auf der Suche nach einer Lösung, um im QFileDialog beim öffnen eines Bildes dieses als Preview mit einigen Informationen angezeigt zu bekommen.

Unter qt3 gab es dafür die QFilePreview Klasse, die als Q3FilePreview Class "weiterlebt", aber dafür fordert, das Projekt mit Qt3 Unterstützung zu nutzen.
In Qt 4.6 ist die Funktion leider auch nicht verfügbar.

Meine Überlegung deshalb, den sourcecode von QFileDialog modifizieren und neu zu kompilieren... als QFileDialog2.

Meine Frage, hat jemand schon mal Änderungen / Erweiterungen am Sourcecode von Qt vorgenommen und sich ein Widget / Klasse neu kompiliert ??

Viele Grüße

Bo
Kratzy974
Beiträge: 23
Registriert: 29. September 2009 13:25

Beitrag von Kratzy974 »

Änderungen habe ich schon einmal gemacht (QtWebKit), allerdings keine Dialoge.
QFileDialog selber hat zwei Eigenschaften : Die Static Methoden führen zu Systemdialogen, nicht Static (also instanzieren und dann öffnen) zu Qt eigenen.
In Deinem Fall würde ich einfach (naja, "einfach") einen neuen Dialog erstellen, welcher die von Dir gewünschten Eigenschaften hat. Diesen kannst du dann QFileDialog2 nennen. Um es einfach zu machen, dies immer in Verschiedenen Code Basen zu verwenden würde ich auf uic verzichten und den Dialog von Hand gestalten. Allerdings könnte dabei einige Programmierzeit ins Land gehen.
SkyperHH
Beiträge: 5
Registriert: 29. April 2009 14:38
Wohnort: Hamburg

Beitrag von SkyperHH »

So... hat einige Tage gedauer, aber ich bin weiter gekommen...

Ein Kollege hat mir den Tip gegeben, doch einfach das Layout zu modifizieren, wie im Beispiel hier http://qt.nokia.com/developer/faqs/667 ... funktioniert auch wunderbar. Beispiel mit SourceCode folgt, wenns richtig fertig...

Hab nur ein Problem... wenn ich unter Linux den FileDialog aufmache (egal ob statisch oder nicht), ein File anklicke, dann schließt sich der Dialog sofort wieder. Das selektierte File wird auch richtig übergeben...
Bei diesem Verhalten läßt sich ja die Preview Funktion nicht wirklich nutzen...
Halte ich z.B. die "Strg" Taste gedrückt, kann ich verschiedene Files nacheinander selektieren, ohne den Dialog sofort zu verlassen...

Unter Windows (Qt FileDialog, nicht den "statischen" von Windows) kann ich ein File selektieren, ohne sofort den Dialog zu verlassen...

Bug oder Feature ???
SkyperHH
Beiträge: 5
Registriert: 29. April 2009 14:38
Wohnort: Hamburg

Beitrag von SkyperHH »

Mein Beispiel ... leider noch nicht ganz fertig.

Code: Alles auswählen

#include <QFileDialog>
#include <QString>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QLayoutItem>
#include <QSplitter>
#include <QWidget>
#include <QLabel>
#include <QPixmap>

class FileDialogPreview : public QFileDialog
{
    Q_OBJECT

    public:
        FileDialogPreview(QWidget *parent = 0);

    private slots:
        void setPreviewPicture(const QString &picture);

    private:
        QLabel *lblPreviewPicture;
        QLabel *lblPreviewPictureWidth;
        QLabel *lblPreviewPictureHeight;
        QLabel *lblPreviewPictureRatio;
        QLabel *lblPreviewPictureWidthText;
        QLabel *lblPreviewPictureHeightText;
        QLabel *lblPreviewPictureRatioText;
};

Code: Alles auswählen

#include "filedialogpreview.h"

FileDialogPreview::FileDialogPreview(QWidget *parent) : QFileDialog(parent)
{
    QGridLayout *gridLayout = dynamic_cast<QGridLayout *>(this->layout());
    if (gridLayout != NULL)
    {
        QLayoutItem *layoutItem = gridLayout->itemAtPosition(1,0);
        QSplitter *splitter;
        splitter = dynamic_cast<QSplitter *>(layoutItem->widget());

        if (splitter != NULL)
        {
            QFrame *framePreView = new QFrame(splitter);
            splitter->addWidget(framePreView);

            QVBoxLayout *vboxPreViewLayout = new QVBoxLayout(framePreView);
            QGridLayout *gridPreViewLayout = new QGridLayout();

            lblPreviewPictureWidthText = new QLabel(framePreView);
            lblPreviewPictureHeightText = new QLabel(framePreView);
            lblPreviewPictureRatioText = new QLabel(framePreView);

            lblPreviewPicture = new QLabel(framePreView);
            lblPreviewPicture->setFrameShape(QFrame::NoFrame);
            lblPreviewPicture->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
            lblPreviewPicture->setMinimumSize(100,100);

            lblPreviewPictureWidth = new QLabel(framePreView);
            lblPreviewPictureHeight = new QLabel(framePreView);
            lblPreviewPictureRatio = new QLabel(framePreView);

            gridPreViewLayout->addWidget(lblPreviewPictureWidthText, 0, 0, 1, 1, Qt::AlignLeft);
            gridPreViewLayout->addWidget(lblPreviewPictureWidth, 0, 1, 1, 1, Qt::AlignLeft);
            gridPreViewLayout->addWidget(lblPreviewPictureHeightText, 1, 0, 1, 1, Qt::AlignLeft);
            gridPreViewLayout->addWidget(lblPreviewPictureHeight, 1, 1, 1, 1, Qt::AlignLeft);
            gridPreViewLayout->addWidget(lblPreviewPictureRatioText, 2, 0, 1, 1, Qt::AlignLeft);
            gridPreViewLayout->addWidget(lblPreviewPictureRatio, 2, 1, 1, 1, Qt::AlignLeft);
            gridPreViewLayout->setColumnStretch(1,1);

            vboxPreViewLayout->addWidget(lblPreviewPicture, 1, Qt::AlignHCenter);
            vboxPreViewLayout->addLayout(gridPreViewLayout);
            vboxPreViewLayout->addStretch(1);

            framePreView->setLayout(vboxPreViewLayout);

            connect(this, SIGNAL(currentChanged(QString)), this, SLOT(setPreviewPicture(QString)));
        }
    }
}


void FileDialogPreview::setPreviewPicture(const QString &picture)
{
    QPixmap pixmapPicture;
    if (pixmapPicture.load(picture))        
    {
        int x, y;
        double ratio;
        x = pixmapPicture.width();
        y = pixmapPicture.height();
        ratio = double(x) / double(y);

        if ((x > lblPreviewPicture->width()) || (y > lblPreviewPicture->height()))
        {
            lblPreviewPicture->setScaledContents(true);
            if (x > y)
            {
                lblPreviewPicture->setMinimumHeight(int(lblPreviewPicture->size().width() / ratio));
            }
            else
            {
                lblPreviewPicture->setMinimumWidth(int(lblPreviewPicture->size().height() * ratio));
            }
        }
        else
        {
            lblPreviewPicture->setScaledContents(false);
            lblPreviewPicture->setMinimumSize(100,100);
        }
        
        lblPreviewPicture->setPixmap(picture);
        lblPreviewPictureWidthText->setText(tr("Width:"));
        lblPreviewPictureHeightText->setText(tr("Height:"));
        lblPreviewPictureRatioText->setText(tr("Ratio:"));
        lblPreviewPictureWidth->setText(tr("%1 px").arg(x));
        lblPreviewPictureHeight->setText(tr("%1 px").arg(y));
        lblPreviewPictureRatio->setText(tr("%1").arg(ratio,0,'f',3));
    }
    else
    {
        lblPreviewPicture->clear();
        lblPreviewPictureWidthText->clear();
        lblPreviewPictureHeightText->clear();
        lblPreviewPictureRatioText->clear();
        lblPreviewPictureWidth->clear();
        lblPreviewPictureHeight->clear();
        lblPreviewPictureRatio->clear();
    }
}
Dateianhänge
Preview Dialog
Preview Dialog
Dialog.jpg (70.11 KiB) 3307 mal betrachtet
Antworten