GradientDialogWidget

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

GradientDialogWidget

Beitrag von skeemo » 2. Dezember 2010 16:41

Hallo,

nachdem es wohl keinen GradientEditorDialog o.Ä. gibt, zumindest habe ich keinen gefunden, wollte ich mal fragen ob jemand vielleicht ein paar Ideen hat, wie man sowas am besten realisiert bzw. vielleicht hat sowas jemand schonmal gemacht ?

Den "Editor" in der Gradient-Demo finde ich wenig intuitiv bzw. zu kompliziert.

Eigentlich möchte ich 2 maximal 3 Farben einstellen können und vielleicht noch Focal Point bei nem RadialGradient und Start-/Endpunkte.


Hmmmmmmm...

upsala
Beiträge: 3946
Registriert: 5. Februar 2006 21:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala » 2. Dezember 2010 17:51

Was hältst du von dem, der bei Gimp dabei ist.

skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo » 2. Dezember 2010 20:46

Uff habe ich schon länger nicht mehr benutzt / installiert.

Sieht der so aus wie auf diesem Screen ?

http://docs.gimp.org/de//images/dialogs ... dialog.png


Eigentlich gefiel mir der von Flash CS3 ganz gut.
Der ist quasi wie ein Slider, nur mit mehreren Handles, wobei jeder Handle eine Farbe repräsentiert. Wenn man den Handle anklickt, konnte man dessen Farbe bestimmen und mit ziehen halt die Stops setzen.

Ja ich glaube den finde ich gut :)

Gibts sowas schon als Widget ?

Oder zumindest einen "Multi-Handle"-Slider ?

upsala
Beiträge: 3946
Registriert: 5. Februar 2006 21:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala » 2. Dezember 2010 21:37

Das hier wäre schon mal ein Ansatz:
http://jpnurmi.kapsi.fi/docs/classQxtSp ... l#_details

skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo » 3. Dezember 2010 00:19

Dankeschön, sieht gut aus, blöderweise ist dort nur die .h zum angucken.
Ansonsten finde ich irgendwie keine Downloadmöglichkeit für QXTGUI.

:?:

EDIT:

Ah gefunden :)

skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo » 3. Dezember 2010 00:53

Oh mann, echt frustrierend, oder ich stelle mich einfach zu doof an...

Ich versuche die Bibliothek qxt bei mir zum Laufen zu bekommen, nach diesem Guide :

http://dev.libqxt.org/libqxt/wiki/user_guide

Der Pfad zu qmake ist in meiner PATH Variable enthalten, kann qmake.exe von überall aufrufen.

Trotzdem scheitert configure.bat

Ich bin relativ neu bei QT, hab bisher nur mit den QXyz Klassen rumgespielt. Wie kann ich denn externe libs einbinden ??

Sorry für jegliche blöde Frage :)

Ach ja, ich fuhrwerke auf Windows herum..

skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo » 7. Dezember 2010 22:29

So...wen es interessiert, ich habe mir jetzt selber einen Dialog gebaut :)

Der gefällt mir eigentlich echt gut:

Bild

Nur jetzt habe ich ein anderes Problem:
Ich bekomme ein QGradient Zeiger aus meinem Dialog. Nun möchte / "muss" ich den oder meinetwegen die Dereferenzierung davon einem QGraphicsItem mit item->setData(...) zuweisen.
Das funktioniert auch.
Nur das rausholen geht nicht. Das versuche ich so :

Code: Alles auswählen

QVariant variant = item->data(ID_GRADIENT);
QGradient *gradient = (QGradient*)qVariantValue<QGradient*>(variant);

Der Compiler spuckt mir den Fehler:
qt_metatype_id is not a member of 'QMetaTypeId<QGradient*>'
Ich dache man kann grundsätzlich alles in ein QVariant packen ??
Die Version ohne Zeiger geht genau so wenig.

:?:

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf » 7. Dezember 2010 22:56

Prinzipiell kannst du alles in nen Variant packen - ja. Warum nimmst du hier den Gradient per new? QGradient ist kopierbar und sollte das auch fix erledigen. Evtl. geht das per Value dann auch sofort mit QVariant.
Ansonsten sagt dir die Meldung auch, wie du das Problem behebst: qRegisterMetaType (den Teil hast du nicht mitgepostet).

skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo » 7. Dezember 2010 23:23

Ich frickel gerade mit einer anderen Lösung herum die jetzt auch eigentlich gut funktioniert.

Einen Gradient bekomme ich auch über den für das Item verwendeten Brush mit brush->gradient().

Den Brush hatte ich eh schon gespeichert und ausgelesen, von daher so ganz gut, blos ecke ich schon wieder an :

Ich möchte gerne über alle Stops des Gradient's iterieren.
Dazu mache ich folgendes:

Code: Alles auswählen

// Hässlich ich weiss, aber geht sonst nicht anders...
gradient = const_cast<QGradient*>(brush.gradient());

// Funktioniert
qDebug("gradient type: %d ",gradient->type());


QGradientStops stops = gradient->stops();
for(int i = 0 ; i < stops.count() ; i++)
{
       qDebug("Stop at %f with color: %c",
                             stops.at(i).first, 
                             stops.at(i).second.name().toAscii());
}
Hatte auch zuerst eine foreach variante, die aber genauso wenig lief, denn
das ganze stürzt zur Laufzeit mit einem Illegal Instruction Signal ab direkt in der Zeile mit dem for-Schleifen-Kopf ab..

Komisch, weil ich beim Debuggen an dieser Stelle eigentlich keinen Fehler in meinen Variablen entdecke, alles passt, auch die Werte der QGradientStops in dem Vector.

( QGradientstop is ja nur ein typedef für vector<QGradientstop>....
und das wiederum ein QPair<qreal, QColor> )



EDIT:

Logo, der Fehler liegt natürlich im qDebug Aufruf.

Der muss so heissen:

Code: Alles auswählen

qDebug("Stop at %f with color: %s",
                           stops.at(i).first, 
                           stops.at(i).second.name().toStdString().c_str());

Was ich echt gruseligst finde, mal so am Rand...

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf » 7. Dezember 2010 23:37

skeemo hat geschrieben:Der muss so heissen:

Code: Alles auswählen

qDebug("Stop at %f with color: %s",
                           stops.at(i).first, 
                           stops.at(i).second.name().toStdString().c_str());

Was ich echt gruseligst finde, mal so am Rand...
Genau dafür hat Qt den "qPrintable" erfunden.

skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo » 8. Dezember 2010 01:15

franzf hat geschrieben: Genau dafür hat Qt den "qPrintable" erfunden.
:) danke :)

Gibt viel zu entdecken in Qt

padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh » 8. Dezember 2010 11:47

alternativ: #include <QDebug> und dann qDebug() als Stream nutzen...

Code: Alles auswählen

qDebug() << "Stop at " << stops.at(i).first << "with color: " << stops.at(i).second.name(); 
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs

skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo » 8. Dezember 2010 12:49

Auch cool :)

Thx

Antworten