Seite 1 von 1

QStyle - kein Aufruf von layoutSpacingImplementation

Verfasst: 27. Juni 2011 02:07
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]

Verfasst: 27. Juni 2011 08:06
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.

Verfasst: 27. Juni 2011 11:06
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

Verfasst: 27. Juni 2011 12:57
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()?

Verfasst: 27. Juni 2011 15:39
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..

Verfasst: 27. Juni 2011 16:24
von Julia
bin nun wirklich ratlos..