2010-03-30 8 views
15

के बीच अलग-अलग हो रहा है, मैं एक क्षैतिज स्प्लिटर में एक दूसरे के बगल में एक QWidget और QTabWidget डाल रहा हूं। और स्प्लिटर इसका आकार खो देता है, आप जान सकते हैं कि केवल माउस पर होवर करके एक स्प्लिटर है। इसे कैसे दिखाना है?QSplitter QWidget और QTabWidget

धन्यवाद।

उत्तर

25

पर क्यूटी स्टाइल शीट के बारे में अधिक मिल सकता है, तो आप इसे करने के लिए अन्य विजेट जोड़ सकते हैं । अतीत में इस सटीक समस्या को हल करने के लिए मैंने यह किया है:

// 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); 

यह स्प्लिटर हैंडल में एक सनकी रेखा जोड़ता है। आप निश्चित रूप से फ्रेम line फ्रेम के लिए एक और शैली चुन सकते हैं या स्प्लिटर हैंडल में जोड़े गए विजेट के रूप में पूरी तरह से कुछ अलग उपयोग कर सकते हैं।

+0

के साथ हैंडल वापस करने के लिए QSplitter :: createHandle() को ओवरराइड कर सकते हैं बहुत बहुत धन्यवाद :)! – Narek

+0

यह शानदार है। मैं केवल इतना जोड़ूंगा कि मैं एक QHBoxLayout पसंद करता हूं क्योंकि तब मैं क्षैतिज रेखा पर 'अधिकतम विड्थ' (क्षैतिज स्प्लिटर के लिए) असाइन कर सकता हूं। – Phlucious

+0

उपरोक्त क्योंकि यह काम करता है, लेकिन यह वास्तव में एक क्यूटी बग के लिए एक बेकार कामकाज की तरह लगता है ... –

7

यह कम से कम WinXP के साथ प्रत्येक स्प्लिटर और डिफ़ॉल्ट लुना थीमा (क्लासिक में समस्या हल करने में समस्या) के लिए सच है। यदि आप लुना के साथ रहना चाहते हैं तो आप स्प्लिटर के तरीके को बदल सकते हैं, उदाहरण के लिए हैंडल के पृष्ठभूमि रंग को बदलकर।

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

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

आप QSplitterHandle (जो ज्यादातर लोगों 'विभाजक' के रूप में के बारे में सोच) QWidget से प्राप्त होता है https://doc.qt.io/qt-5/stylesheet-reference.html

+0

धन्यवाद। यह रंग बदलता है लेकिन मैं स्प्लिटर राहत बदलना चाहता हूं। क्या यह संभव है? – Narek

+0

खिड़कियों के नीचे स्प्लिटर का डिफ़ॉल्ट व्यवहार पृष्ठभूमि रंग खींचना है। यह तब खराब होता है जब विभाजित घटकों में डिफ़ॉल्ट रूप से बीजी-रंग होता है (QWidget)। खिड़कियों का तरीका उन्हें एक अलग रंग और/या एक सनकी सीमा देना है (QFrame सीमाओं का समर्थन करता है)। यदि आप राहत का उपयोग करना चाहते हैं तो आपको शैली बदलनी होगी (स्टाइल शीट के बारे में भूल जाओ)। शैली बदलने के लिए setStyle() का उपयोग करें। राहत समर्थित है उदा। QPlastiqueStyle द्वारा। आप QApplication ऑब्जेक्ट पर या केवल स्प्लिटर (पसंदीदा नहीं) पर setStyle() लागू कर सकते हैं। मैं पहले वर्णित देशी समाधान का प्रस्ताव दूंगा। – merula

+0

आप कस्टम ड्राइंग –

8

मैं इसे उपरोक्त कोड पर आधारित करता हूं लेकिन यह दोनों स्प्लिटर उन्मुखता को संभालता है। मैंने अभी गैर-अपारदर्शी आकार बदलने और गैर-ढहने वाले बच्चों को प्राथमिकता दी है। पकड़ में तीन समांतर रेखाएं होती हैं। आप हैंडल चौड़ाई के साथ खेल सकते हैं, लेकिन 7 पर पकड़ विंडोज पर अच्छा लग रहा है; लिनक्स या मैक में चेक नहीं किया है।

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

शायद Qt5.6 का उपयोग कर यहां सबसे अच्छा समाधान भी है। धन्यवाद! – Plouff

+0

पकड़ने के लिए 'gripWidth = 2' सेट करना था (Win7 क्लासिक लुक)।अन्यथा एक समस्या के लिए अच्छा समाधान जो कि क्यूटी साल पहले तय किया जाना चाहिए था। – DerManu

0

आप QSplitter उपवर्ग है और यह कुछ भी आप खुश करता है कि वापस जाने के लिए protected virtual QSplitterHandle * QSplitter::createHandle() है ओवरराइड कर सकते हैं।

उदाहरण के लिए, उस अधिभारित विधि से आप कस्टम ड्राइंग के साथ QSplitterHandle के उप-वर्ग को वापस कर सकते हैं।

-1

मेरुला के उत्तर के लिए धन्यवाद ... मैंने कोशिश की और अब मेरे स्प्लिटर दिखाई दे रहे हैं और बिना घुसपैठ के देखकर बहुत अच्छे लग रहे हैं। यह कोड PyQt या PySide का उपयोग कर पायथन के लिए है।

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

यह कौन सी भाषा है? यह C++ –

+0

ओह की तरह दिखता नहीं है .. क्षमा करें यह pyqt या pyside का उपयोग कर अजगर है – panofish

संबंधित मुद्दे