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
QFileDialog mit Bild Preview
Ä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.
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.
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 ???
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 ???
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
- Dialog.jpg (70.11 KiB) 3310 mal betrachtet