2010-01-01 5 views
2

Je voudrais utiliser une feuille de style: pseudo-état de focus pour contrôler la représentation de l'état de focus de la vue Arborescence. L'utilisation de la feuille de style suivante fonctionne bien, sauf que le système Qt dessine toujours son propre rectangle. Comment puis-je demander à Qt de ne pas dessiner le rectangle de focalisation, tout en étant capable de focaliser le contrôle pour la saisie au clavier?Qt4 Stylesheets et Focus Rect

QTreeView { 
    background: #505050; 
    border: 1px solid; 
    border-radius: 10px; 
} 

QTreeView:focus { 
    border: 2px groove; 
} 

Répondre

14

Le rect focus autour du widget QTreeView tourne lui-même être une caractéristique de style Mac. Cela l'éteint par widget:

tree.setAttribute(Qt.WA_MacShowFocusRect, 0) 
0

Je ne sais pas une réponse immédiate à votre question, mais voici un extrait de code pour une vue arborescente je personnalisé avec des feuilles de style qt. Peut-être que cela peut vous aider d'une manière ou d'une autre. Je crois que le show-decoration sélectionné propriété est ce qui permet le tirage de mise au point par défaut (peut-être tort, été un moment que je dupé avec elle)

QString treeview_ss = "QTreeView { color: white; background: black; }" + 
     QString("QTreeView { show-decoration-selected: 0; }") + 
     QString("QTreeView::item:selected { border: 1px solid grey; }") + 
     QString("QTreeView::item:selected:!active { color: white; border: 1px solid grey; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #000000, stop: 1 grey); }") + 
     QString("QTreeView::item:selected:active { border: 1px solid grey; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #000000, stop: 1 grey); }") + 
     QString("QTreeView::item:hover { border: 1px solid grey; }") + 
1

Vous pouvez utiliser setItemDelegate méthode de l'arborescence pour la configuration personnalisée procédure de peinture pour vos articles treeview. Dans la méthode de peinture, vous pouvez supprimer le style QStyle :: State_HasFocus des options des éléments et exécuter la routine de peinture de base. Voici un exemple, désolé c'est C++.

... 
    NoFocusDelegate* delegate = new NoFocusDelegate(); 
    ui->treeView->setItemDelegate(delegate); 
... 

class NoFocusDelegate : public QStyledItemDelegate 
{ 
protected: 
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; 
}; 

void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const 
{ 
    QStyleOptionViewItem itemOption(option); 
    if (itemOption.state & QStyle::State_HasFocus) 
     itemOption.state = itemOption.state^QStyle::State_HasFocus; 
    QStyledItemDelegate::paint(painter, itemOption, index); 
} 

update0: enlever QFocusFrame d'être noient sur un objet en utilisant TREEVIEW personnalisée QStyle. Voici un exemple de descendant de style QMotifStyle personnalisé (je suppose que dans votre cas, je suppose que ce devrait être un descendant de QMacStyle) qui est appliqué à l'objet application. Il ne fait pas de peinture rectangle de cadre chaque fois qu'il détecte un widget QTreeView

class MyStyle1 : public QMotifStyle 
{ 
public: 
    MyStyle1() 
    { 
     //??? 
    } 

    void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget = 0) const 
    { 
     if (element==CE_FocusFrame) 
     { 
      const QFocusFrame* frame = qobject_cast<const QFocusFrame*>(widget); 
      if (frame && frame->widget()) 
      { 
       QTreeView* treeView = qobject_cast<QTreeView*>(frame->widget()); 
       if (treeView) 
       { 
        qDebug() << "no CE_FocusFrame for QFocusFrame over QTreeViews"; 
        return; 
       } 
      } 
     } 
     QMotifStyle::drawControl(element, option, painter, widget); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QCDEStyle style; 
    a.setStyle(new MyStyle1()); 
    //a.setStyle(new QMotifStyle()); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 

espérons que cette aide, ce qui est

+0

@serge, merci pour l'excellente information sur ItemDelegates. Le premier problème que j'ai est un rectangle géant bleu autour de l'ensemble de TreeView que j'ai dénommé. –

+0

J'ai téléchargé une capture d'écran pour illustrer: http://techgame.net/~shane/temp/QTreeView-stylesheets.png –

+1

Je pensais d'abord que vous voulez supprimer les rects focus noyer sur les éléments de vue arborescente, mais je suppose que ce que vous voyez mis en évidence est QFocusFrame noyer sur votre contrôle par le style utilisé pour votre application. Cela ressemble à QMacStyle mais je peux me tromper ici. Je ne peux pas non plus le vérifier sur mon ordinateur portable car j'utilise ubuntu. Pls, voir si une mise à jour que j'ai fait pour le post original fonctionnerait pour vous –