QTabWidget Größe der Tabs verstellen



  • Hi,
    Ich versuche seit geraumer Zeit die Größe der Tabs eines QTabWidgets zu verstellen. Also nicht das QTabWidget selbst. Ich habe schon vieles probiert, aber mir will es nicht gelingen. Ich verstelle ständig die Größe des QTabWidgets, aber nie den Raum, welchen die Tabs an sich benötigen.
    Die schriftgröße verstellen geht.
    Wäre füür einen Tipp dehr dankbar.
    Gruß



  • Mir ist gerade gekommen, das ich eine QTabBar Nehme, und die dann QTabWidget übergebe. Wenn ich den QTabbar Pointer halte müßte ich dessen Größe verstellen können 🙂



  • Das wird dir auch nicht helfen. Die Tab-Größe errechnet der Style.
    Du kannst dir einen Proxy-STyle schreiben, der nur die TabBar und die Tab-Buttons zeichnet. Dann hast du Zugriff auf deine Button-Größe.



  • Verdammt,
    Habe es so versucht wie eben beschrieben. Aber bin wie Du gesagt hast nicht weiter gekommen. Weiß jetzt wenigstens warum.
    Ist es schwer einen Proxy-Style zu schreiben wenn man davon noch nie etwas gehört hat ??
    Und wo finde ich die wichtigsten Infos dazu ??
    Gruß



  • Hatte gehofft mit setbaseSize von QTabBar was machen zu können 😞 haut aber nicht hin



  • Ein ProxyStyle ist nicht wirklich schwer.
    Du leitest von Q(Common)Style ab und implementierst auf einfache Art sämtlichen virtuellen Funktionen, in der Gestalt, dass du nur
    QApplication::style()->virtuelleFunktion(Parameter);
    ausführst. VirtuelleFuntkion() und Parameter natüclich dem entsprechende Fall anpassen.
    Nur die Elemente die du selber stylen willst, fängst du ab und malst sie nach deinen Wünschen. Wie das geht entnimmst du den zahlreichen Styles die existieren. Qt liefert einige selber mit, andere (allen voran bespin und QtCurve) gibts auf kde-look.org. Spicken erlaubt und erwünscht 😉

    QWidget kennt nun auch eine Methode setStyle(). Du brauchst jetzt also nur für dein TabWidget deinen eigenen Style setzen, und alles sollte passen. :p



  • 🙂 :xmas1:
    Danek schön. Werd mal mein Glück versuchen.
    Gruß



  • *lach* Jetzt sind sie klein, aber leider zu klein. Habe Folgendes gemacht,
    was zwar kkopiliert, aber eben nichts tut.

    #ifndef CIM_Style_H
    #define CIM_Style_H
    
    #include <QStyle>
    
    class CIM_Style:public QStyle
    {
      public:
          CIM_Style();
          ~CIM_Style();
          void drawComplexControl ( ComplexControl control, const QStyleOptionComplex * option, QPainter * painter, const QWidget * widget = 0 ) const;
          void drawControl ( ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const;
          void drawItemPixmap ( QPainter * painter, const QRect & rectangle, int alignment, const QPixmap & pixmap ) const;
          void drawItemText ( QPainter * painter, const QRect & rectangle, int alignment, const QPalette & palette, bool enabled, const QString & text, QPalette::ColorRole textRole = QPalette::NoRole ) const;
          void drawPrimitive ( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const;
          QPixmap generatedIconPixmap ( QIcon::Mode iconMode, const QPixmap & pixmap, const QStyleOption * option ) const;
          SubControl hitTestComplexControl ( ComplexControl control, const QStyleOptionComplex * option, const QPoint & position, const QWidget * widget = 0 ) const;
          int pixelMetric ( PixelMetric metric, const QStyleOption * option = 0, const QWidget * widget = 0 ) const;
          QSize sizeFromContents ( ContentsType type, const QStyleOption * option, const QSize & contentsSize, const QWidget * widget = 0 ) const;
          int styleHint ( StyleHint hint, const QStyleOption * option = 0, const QWidget * widget = 0, QStyleHintReturn * returnData = 0 ) const;
          QRect subControlRect ( ComplexControl control, const QStyleOptionComplex * option, SubControl subControl, const QWidget * widget = 0 ) const ;
          QRect subElementRect ( SubElement element, const QStyleOption * option, const QWidget * widget = 0 ) const;
          QPixmap standardPixmap(QStyle::StandardPixmap, const QStyleOption*, const QWidget*) const;
    };
    
    #endif //CIM_Style_H
    

    Dann die "Implementierung"

    #include "CIM_Style.h"
    
    CIM_Style::CIM_Style()
    {
    
    }
    
    CIM_Style::~CIM_Style()
    {
    
    }
    
    void CIM_Style::drawComplexControl ( ComplexControl control, const QStyleOptionComplex * option, QPainter * painter, const QWidget * widget ) const
    {
    
    }
    
    void CIM_Style::drawControl ( ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget ) const
    {
    
    }
    
    void CIM_Style::drawItemPixmap ( QPainter * painter, const QRect & rectangle, int alignment, const QPixmap & pixmap ) const
    {
    
    }
    
    void CIM_Style::drawItemText ( QPainter * painter, const QRect & rectangle, int alignment, const QPalette & palette, bool enabled, const QString & text, QPalette::ColorRole textRole ) const
    {
    
    }
    
    void CIM_Style::drawPrimitive ( PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget) const
    {
    
    }
    
    QPixmap CIM_Style::generatedIconPixmap ( QIcon::Mode iconMode, const QPixmap & pixmap, const QStyleOption * option ) const
    {
        return pixmap;
    }
    
    QStyle::SubControl CIM_Style::hitTestComplexControl ( ComplexControl control, const QStyleOptionComplex * option, const QPoint & position, const QWidget * widget ) const
    {
        return QStyle::SC_TitleBarMinButton;
    }
    
    int CIM_Style::pixelMetric ( PixelMetric metric, const QStyleOption * option, const QWidget * widget  ) const
    {
      return 0;
    }
    
    QSize CIM_Style::sizeFromContents ( ContentsType type, const QStyleOption * option, const QSize & contentsSize, const QWidget * widget ) const
    {
      return contentsSize;
    }
    
    int CIM_Style::styleHint ( StyleHint hint, const QStyleOption * option , const QWidget * widget , QStyleHintReturn * returnData ) const
    {
      return 0;
    }
    
    QRect CIM_Style::subControlRect ( ComplexControl control, const QStyleOptionComplex * option, SubControl subControl, const QWidget * widget  ) const
    {
      return QRect(0,0,50,50);
    }
    
    QRect CIM_Style::subElementRect ( SubElement element, const QStyleOption * option, const QWidget * widget ) const 
    {
      return QRect(0,0,50,50);
    }
    
    QPixmap CIM_Style::standardPixmap(QStyle::StandardPixmap, const QStyleOption*, const QWidget*) const
    {
    
    }
    

    Und dann im eigentlichen Programm ein

    Tab_bar->setStyle(::new CIM_Style);
    

    Jetzt habe ich garkeine Tabs mehr 😞
    Mir ist schon klar dass ich was tuen muß in den Funktionen. Die Frage ist aber was ???
    Gruß



  • Les dir erstmal genauer durch, was die einzelnen Funktionen machen. Die QStyle-Doku ist nicht sooo lang, es gibt sogar in den Examples einen eigenen minimalen Style.

    Nichts zu machen hab ich nicht gesagt, schau dir an was ich fett geschrieben hab, das für die Funktionen anpassen.
    Als Beispiel:

    void CIM_Style::drawItemPixmap ( QPainter * painter, const QRect & rectangle, int alignment, const QPixmap & pixmap ) const
    {
        QApplication::style()->drawItemPixmap(painter, rectangle, alignment, pixmap); 
    }
    

    Du delegierst das Zeichnen einfach an den Default-Style.
    Nur das was du selber haben willst (schau mal, vllt. reicht ja eines von styleHint/pixelMetric/subControlRect zu personalisieren).



  • Okay super Riesig.
    Rufe jetzt in jeder Funktion in CIM_Style die deflaut Funktion des Defaultstyles auf. (Sofern ich das richtig verstanden habe)

    Im Nächsten Schritt gucken was die Funktionen machen und dann das verändern, was ich benörige umd die Tabgrößen an zu passen richtig ?? 🙂
    Also irgend eien Funktion mit Paint denke ich
    Gruß und danke für Hilfe



  • AlexXXx schrieb:

    Also irgend eien Funktion mit Paint denke ich

    Jein, das henk vom Umfang deiner Änderungswünsche ab. Willst du echt nur die Größe, reicht es evtl. eine der FUnktionen anzupassen, die was in der Art zurüvkgeben. Schau da mal in die Doku von
    * styleHint()
    * pixelMetric()
    * subControlRect()
    * etc
    Denn die anderen Funktionen bekommen Rects (über die option), wo sie den Inhalt reinzeichnen sollen, die Rects werden wiederum aus den returns der o.g. Funktionen errechnet.
    Aber ich hab selber noch keinen Style gezeichnet, nur hin und wieder aus Interesse in den Code geschaut. Darum kann ich nicht aus dem Stegreif sagen, was du noch alles selber implementieren musst. Darum fang mit den Größen an, vllt. reicht das ja schon 🙂



  • Also man kann die Größe der Tabs mit:

    sizeFromContents ( ContentsType type, const QStyleOption * option, const QSize & contentsSize, const QWidget * widget ) const
    

    Setzen 🙂 Das hat ja ewig gedauert. Und das bei dem Funktionsname.

    COOOOOOOOOOL


Anmelden zum Antworten