QStyle - kein Aufruf von layoutSpacingImplementation

Alles rund um die Programmierung mit Qt
Antworten
Julia
Beiträge: 24
Registriert: 18. April 2011 14:42

QStyle - kein Aufruf von layoutSpacingImplementation

Beitrag von Julia »

Hallo,

habe von der Klasse QPlastiqueStyle abgeleitet
und mir einen eigenen Style geschrieben.

Leider fehlen mir jegliche Spacings
in der gesamten GUI.

Ich rufe jedes Layout mit dem Default-Konstruktor auf.
Das heisst Spacing = -1

Es gibt in der Klasse QPlastiqueStyle einen konstanten
protected slot namens: layoutSpacingImplementation

Diese Methode sollte laut Qt Diku bei einem Wert von -1 aufgerufen werden und das korrekte Spacing für das gefragte Element zurückliefern.

Habe den Slot in meiner abgeleiteten Styleklasse implementiert
aber er wird nicht aufgerufen.
Woran liegt das?

Anbei der Code

Code: Alles auswählen


// header
 	protected slots:
 		int layoutSpacingImplementation(QSizePolicy::ControlType control1,
			QSizePolicy::ControlType control2, 
 			Qt::Orientation orientation,
 			const QStyleOption *option = 0, 
 			const QWidget *widget = 0) const;

// cpp

int XStyle::layoutSpacingImplementation(QSizePolicy::ControlType control1,
								QSizePolicy::ControlType control2, 
								Qt::Orientation orientation,
								const QStyleOption *option, 
								const QWidget *widget) const 
{
	return(6);
 	//return QPlastiqueStyle::layoutSpacingImplementation(control1,control2,orientation,option,widget);
}
[/code]
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Hast du denn auch ein Q_OBJECT in der Klassendefinition stehen?
Denn immer wenn du deine eigene Klasse ans Qt MetaObject-System anschließen willst, musst du das Macro verwenden (und natürlich den Header mocen).
Hintergrund ist der, dass layoutSpacing() die layoutSpacingImplementation() über das metaObject() aufruft.

Normalerweise wird sowas ja über virtual gelöst. layoutSpacingImplementation() kam aber erst mit Qt-4.3 dazu. Hinzufügen einer virtuellen Methode bricht die ABI-Kopatibilität, dadurch müssten Qt-Programme neu kompiliert werden - geht nicht, Qt verspricht ABI-Kompatibilität!
Deshalb die "Krücke" mit dem metaObject.

// edit:
Noch ein Link dazu, was man alles darf und nicht darf, wenn man Binärkompatibilität wahren will.
Julia
Beiträge: 24
Registriert: 18. April 2011 14:42

Beitrag von Julia »

Logisch steht da ein Q_Object

Code: Alles auswählen

class XStyle : public QPlastiqueStyle
{
   Q_OBJECT
es geht trotzdem noch nicht?!
hab alles neu gebaut!

Es gibt auch keine Output-Mmeldung
dass kein Slot vorhanden ist
oder die connection fehlschlägt
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Da gibts keine Connection! Der SLOT wird direkt über das metaObject aufgerufen:

Code: Alles auswählen

int QStyle::layoutSpacing(QSizePolicy::ControlType control1, QSizePolicy::ControlType control2,
                          Qt::Orientation orientation, const QStyleOption *option,
                          const QWidget *widget) const
{
    Q_D(const QStyle);
    if (d->layoutSpacingIndex == -1) {
        d->layoutSpacingIndex = metaObject()->indexOfMethod(
            "layoutSpacingImplementation(QSizePolicy::ControlType,QSizePolicy::ControlType,"
            "Qt::Orientation,const QStyleOption*,const QWidget*)"
            );
    }
    if (d->layoutSpacingIndex < 0)
        return -1;
    int result = -1;
    void *param[] = {&result, &control1, &control2, &orientation, &option, &widget};

    const_cast<QStyle *>(this)->qt_metacall(QMetaObject::InvokeMetaMethod,
                                            d->layoutSpacingIndex, param);
    return result;
}
Dass es nicht geht, find ich jetzt komisch...
In der Doku steht ja auch noch dieser Satz:
This function is called by the layout system. It is used only if PM_LayoutHorizontalSpacing or PM_LayoutVerticalSpacing returns a negative value.
Tust du das (oder QPlstiqueStyle) in pixelMetric()?
Julia
Beiträge: 24
Registriert: 18. April 2011 14:42

Beitrag von Julia »

Anbei meine pixelMetric

Code: Alles auswählen

int XStyle::pixelMetric(PixelMetric metric,  const QStyleOption *option,
						   const QWidget *widget) const
{
	switch (metric) 
	{
	case PM_ToolBarIconSize:
		return 36;
		break;
 	case PM_DockWidgetSeparatorExtent:
 		return 4;
	case PM_LayoutHorizontalSpacing:
		return -1;
	case  PM_LayoutVerticalSpacing:
		return -1;
default:
	return QPlastiqueStyle::pixelMetric(metric, option, widget);
	}
und diese Methode wird tatsächlich aufgerufen bzw -1 zurückgegeben
aber den Slot ruft er nicht auf..
Julia
Beiträge: 24
Registriert: 18. April 2011 14:42

Beitrag von Julia »

bin nun wirklich ratlos..
Antworten