2010-08-31 11 views
4

Quelle est la meilleure façon de rendre capsule-style toolbar controls (y compris le texte de l'étiquette sous les boutons) dans une application Qt?Créer des contrôles de barre d'outils de style capsule dans Qt

En ce qui concerne le rendu des boutons, je souhaite exploiter autant que possible les fonctionnalités de Mac OS. (Je ne suis pas un développeur Mac, donc je ne sais pas s'il a une API pour cela.) Je sais que je peux les dessiner moi-même, utiliser des feuilles de style pour border-image, deviner sur la police et tout paramétrer dans une mise en page, mais y a-t-il une meilleure façon d'assurer une présentation cohérente lorsque Mac met à jour son "look and feel"? J'utilise C++ dans Qt.

Je ne déteste pas l'idée d'utiliser Q_WS_MAC pour obtenir le rendu spécifique à la plate-forme, mais est-ce que Qt a déjà quelque chose pour cela? Vous savez, une méthode setCapsuleStyle(true) quelque part? :)

Merci pour vos suggestions.

Répondre

3

Il existe un exemple de bouton segmenté dans le référentiel qt-labs qui semble décent sur KDE. Il a une bonne quantité de code #ifdef Q_WS_MAC, mais je ne sais pas comment il rend sur Mac. Vous pouvez le trouver here.

Si vous ne ciblez que Mac, vous pouvez utiliser le QMacCocoaViewContainer pour afficher des boutons segmentés natifs. Sa courbe d'apprentissage est assez raide, donc vous pouvez trouver ce blog Qt Labs sur le widget Mac intéressant: Mac widget style addons. L'auteur fournit trois widgets Mac: QtCocoaPushButton, QtCocoaComboBox et QtCocoaSegmentedButton.

1

Comme Qt ne fournit pas ce type de widget en lui-même, le meilleur moyen serait de sous-classer QPushButton et de réimplémenter paintEvent. Vous pouvez ensuite dessiner votre pixmap de capsule en peignant simplement un QPixmap qui contient une capture d'écran du bouton de la capsule. Vous pouvez ajouter un comportement de clic en réimplémentant mousePressEvent et mouseReleaseEvent.

// CapsuleButton.h 
class CapsuleButton : public QPushPutton { 
    // ... 
protected: 
    void paintEvent(QPaintEvent*); 
    void mousePressEvent(QMouseEvent*); 
    void mouseReleaseEvent(QMouseEvent*); 
    // ... 
private: 
    QPixmap pixmap_; 
    QPixmap pressedPixmap_; 
    bool pressed_; 
}; 

// CapsuleButton.cpp 
CapsuleButton::CapsuleButton(QObject* parent) : 
    QPushButton(parent), 
    pixmap_(":/capsule-button-background.png"), 
    pressedPixmap_(":/capsule-button-background-pressed.png"), 
    pressed_(false) 
{ /*...*/ } 

void CapsuleButton::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 
    painter.drawPixmap(rect(), pressed_? pressedPixmap_ : pixmap_); 
} 

void CapsuleButton::mousePressEvent(QMouseEvent* event) 
{ 
    if (event->button() == Qt::LeftButton) 
     pressed_ = true; 
    update(); 
} 

void CapsuleButton::mouseReleaseEvent(QMouseEvent*) 
{ 
    pressed_ = false; 
    update(); 
} 

J'ai writte un tutoriel sur la façon de créer des widgets personnalisés: http://www.serenethinking.com/2010/08/how-to-create-custom-widgets-with-qt/

Peut-être que cela aide.

0

J'ai fait des choses similaires dans le passé. Malheureusement, je n'ai pas son code source avec moi pour partager avec vous. Cependant le pari le plus sûr est d'utiliser Qt Style sheets. Ils prennent en charge diverses propriétés, pseudo-états et sous-contrôles qui permettent de personnaliser l'apparence à tout point de vue.