2010-03-30 12 views
15

arasında ayırt edilemez hale geliyor Bir homojen ayırıcıda bir QWidget ve bir QTabWidget yan yana yerleştiriyorum. Ve splitter onun şeklini kaybeder, onun üzerinde sadece fareyi tutarak bir splitter olduğunu bilirsiniz. Nasıl görünür hale getirilir?QSpitter QWidget ve QTabWidget

Teşekkürler.

cevap

25

de Qt stil sayfaları üzerinde daha bulabilir . İşte geçmişte bu kesin sorunu çözmek için yaptıklarını geçerli:

// Now add the line to the splitter handle 
// Note: index 0 handle is always hidden, index 1 is between the two widgets 
QSplitterHandle *handle = pSplitter->handle(1); 
QVBoxLayout *layout = new QVBoxLayout(handle); 
layout->setSpacing(0); 
layout->setMargin(0); 

QFrame *line = new QFrame(handle); 
line->setFrameShape(QFrame::HLine); 
line->setFrameShadow(QFrame::Sunken); 
layout->addWidget(line); 

Bu ayırıcı koluna bir batık çizgi ekler. Tabii ki, çerçeve line için başka bir stil seçebilir veya bölme tutamaçına eklediğiniz widget olarak tamamen farklı bir şey kullanabilirsiniz.

+0

ile geri dönmek için QSplitter :: createHandle() öğesini geçersiz kılabilirsiniz. Çok teşekkür ederim :)! – Narek

+0

Bu harika. Ben sadece bir QHBoxLayout'u tercih ettiğimi eklerim, çünkü o zaman yatay çizgiye bir "maximumWidth" (yatay ayırıcılar için) atayabilirim. – Phlucious

+0

İşe yaradığı için muhakkak cevaplandı, ama gerçekten Qt hatası için sakıncalı bir çözüm gibi geliyor ... –

7

Bu, en azından WinXP ve varsayılan Luna thema (klasik olarak değiştirilip sorunun çözülmesi) ile her dağıtıcı için geçerlidir. Luna'da kalmak isterseniz, bölücülerin işlenme şeklini değiştirebilirsiniz, örn. Sapın arka plan rengini değiştirerek. (Çoğu insan 'splitter' olarak düşünmek budur) QSplitterHandle QWidget türetilmiştir yana

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

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

Sen buna diğer widget'lar ekleyebilir, https://doc.qt.io/qt-5/stylesheet-reference.html

+0

Teşekkürler. Bu renk değiştirir ama splitter kabartma değiştirmek istiyorum. Mümkün mü? – Narek

+0

Pencerelerin altındaki ayırıcının varsayılan davranışı, arka plan rengini çizmektir. Bölünmüş bileşenler varsayılan olarak bg-rengine sahip olduğunda bu durum kötüdür (QWidget). Pencerelerin yolu onlara farklı bir renk ve/veya batık bir sınır vermek (QFrame sınırları destekler). Rölyef kullanmak istiyorsanız stili değiştirmeniz gerekir (stil sayfasını unutun). Stili değiştirmek için setStyle() öğesini kullanın. Kabartmalar örn. QPlastiqueStyle tarafından. SetStyle() uygulamasını QApplication nesnesine veya yalnızca splitter'e (tercih edilmez) uygulayabilirsiniz. Öncelikle belirtilen yerel çözümü öneriyorum. – merula

+0

Özel çizim –

8

Bunu yukarıdaki koda göre yapıyorum ancak her iki splitter yönlendirmesini de ele alıyor. Sadece opak olmayan yeniden boyutlandırmayı ve katlanamayan çocukları tercih ettim. Sap, üç paralel çizgiden oluşur. Kulp genişliği ile oynayabilirsiniz, ancak 7'de tutuş Windows'da iyi görünüyor; Linux veya Mac’te kontrol etme.

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

Muhtemelen Qt5.6 kullanarak bile en iyi çözüm. Teşekkürler! – Plouff

+0

Sapların görülmesi için 'gripWidth = 2' ayarlanmıştı (Win7 Classic görünümü).Aksi takdirde Qt yıl önce düzeltilmesi gereken bir sorun için güzel bir çözüm. – DerManu

0

Sen QSplitter alt sınıf ve eğer seni mutlu şey dönmek için protected virtual QSplitterHandle * QSplitter::createHandle() var geçersiz kılabilir. Örneğin, bu aşırı yüklenen yöntemden, QSplitterHandle alt sınıfını özel çizimle döndürebilirsiniz.

-1

Merula'nın cevabı sayesinde ... Bunu denedim ve şimdi bölüşümlerim görülebilir ve rahatsız edici görünmeden çok güzel görünüyorsun. Bu kod PyQt veya PySide kullanarak Python içindir.

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

Bu hangi bir dildir? Bu C++ –

+0

oops gibi görünmüyor .. python pyqt veya pyside kullanarak python bu – panofish