2010-03-30 4 views

Antwort

25

bei https://doc.qt.io/qt-5/stylesheet-reference.html mehr auf Qt-Stylesheets finden Da die QSplitterHandle (das ist, was die meisten Leute denken, der als ‚Splitter‘) von QWidget abgeleitet ist, können Sie andere Widgets hinzufügen . Hier ist, was ich getan habe, um dieses genaue Problem in der Vergangenheit zu lösen:

Dies fügt eine versenkte Linie zum Splitter Griff. Sie können natürlich einen anderen Stil für den Rahmen line wählen oder etwas völlig anderes als das Widget verwenden, das Sie dem Splitter-Handle hinzufügen.

+0

Vielen Dank :)! – Narek

+0

Das ist fantastisch. Ich würde nur hinzufügen, dass ich ein QHBoxLayout bevorzuge, weil ich dann eine 'maximumWidth' (für horizontale Splitter) der horizontalen Linie zuweisen kann. – Phlucious

+0

Upvoted, weil es funktioniert, aber es fühlt sich wirklich wie eine ungeschickte Workaround für einen Qt-Bug ... –

7

Dies gilt für jeden Splitter zumindest mit WinXP und dem Standard-Luna-Thema (die Umstellung auf classic löst das Problem). Wenn Sie bei Luna bleiben möchten, können Sie die Darstellung der Splitter ändern, z. durch Ändern der Hintergrundfarbe des Griffs.

int main(int argc, char *argv[]) { 

    QApplication a(argc, argv); 
    a.setStyleSheet("QSplitter::handle { background-color: gray }"); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 

Sie können

+0

Danke. Dies ändert die Farbe, aber ich möchte das Splitterrelief ändern. Ist das möglich? – Narek

+0

Das Standardverhalten von Splitter unter Windows ist, Hintergrundfarbe zu zeichnen. Dies ist schlecht, wenn die geteilten Komponenten auch standardmäßig bg-color haben (QWidget). Der Windows-Weg ist, um ihnen eine andere Farbe und/oder eine versunkene Grenze zu geben (QFrame unterstützt Grenzen). Wenn Sie Relief verwenden möchten, müssen Sie den Stil ändern (Stylesheet vergessen). Verwenden Sie setStyle(), um den Stil zu ändern. Reliefs werden z.B. von QPlastiqueStyle. Sie können setStyle() auf das QApplication-Objekt oder nur auf den Splitter anwenden (nicht bevorzugt). Ich würde vorschlagen, die native Lösung zuerst erwähnt. – merula

+0

Sie können QSplitter :: createHandle() überschreiben, um Handle mit benutzerdefinierter Zeichnung zurückzugeben –

8

Ich basierte dies auf dem obigen Code, aber es behandelt beide Splitterorientierungen. Ich bevorzugte nur nicht-opaque Größenänderung und nicht zusammenklappbare Kinder. Der Griff besteht aus drei parallelen Linien. Sie können mit der Griffbreite spielen, aber Griff bei 7 sieht gut aus unter Windows; habe nicht in Linux oder Mac eingecheckt.

void helper::decorateSplitter(QSplitter* splitter, int index) 
{ 
    Q_ASSERT(splitter != NULL); 

    const int gripLength = 15; 
    const int gripWidth = 1; 
    const int grips = 3; 

    splitter->setOpaqueResize(false); 
    splitter->setChildrenCollapsible(false); 

    splitter->setHandleWidth(7); 
    QSplitterHandle* handle = splitter->handle(index); 
    Qt::Orientation orientation = splitter->orientation(); 
    QHBoxLayout* layout = new QHBoxLayout(handle); 
    layout->setSpacing(0); 
    layout->setMargin(0); 

    if (orientation == Qt::Horizontal) 
    { 
     for (int i=0;i<grips;++i) 
     { 
      QFrame* line = new QFrame(handle); 
      line->setMinimumSize(gripWidth, gripLength); 
      line->setMaximumSize(gripWidth, gripLength); 
      line->setFrameShape(QFrame::StyledPanel); 
      layout->addWidget(line); 
     } 
    } 
    else 
    { 
     //this will center the vertical grip 
     //add a horizontal spacer 
     layout->addStretch(); 
     //create the vertical grip 
     QVBoxLayout* vbox = new QVBoxLayout; 
     for (int i=0;i<grips;++i) 
     { 
      QFrame* line = new QFrame(handle); 
      line->setMinimumSize(gripLength, gripWidth); 
      line->setMaximumSize(gripLength, gripWidth); 
      line->setFrameShape(QFrame::StyledPanel); 
      vbox->addWidget(line); 
     } 
     layout->addLayout(vbox); 
     //add another horizontal spacer 
     layout->addStretch(); 
    } 
} 
+0

Wahrscheinlich die beste Lösung hier sogar mit Qt5.6. Vielen Dank! – Plouff

+0

Hatte 'GripWidth = 2' gesetzt, damit die Griffe sichtbar sind (Win7 Classic-Look).Sonst nette Lösung für ein Problem, das in Qt Jahren behoben sein sollte. – DerManu

0

Sie können QSplitter Unterklasse und überschreiben sie protected virtual QSplitterHandle * QSplitter::createHandle() ist etwas zurückzugeben, die Sie glücklich macht.

Zum Beispiel können Sie von dieser überladenen Methode die Unterklasse QSplitterHandle mit benutzerdefinierter Zeichnung zurückgeben.

-1

Dank Merulas Antwort ... Ich habe es versucht und jetzt sind meine Splitter sichtbar und sehen sehr gut aus, ohne aufdringlich zu wirken. Dieser Code ist für Python mit PyQt oder PySide.

app = QtGui.QApplication(sys.argv) 
app.setStyle("Plastique") # set style (using this style shows splitters! :) 
+0

Welche Sprache ist das? Das sieht nicht aus wie C++ –

+0

oops .. sorry das ist python mit pyqt oder pyside – panofish