2017-07-21 10 views
10

मैं व्युत्पन्न है में दिखाई नहीं QTabBar के वर्ग को लागू करने के लिए "+" (new tab button) QToolButton का उपयोग कर बटन (समान क्रोम गूगल के लिए)। हालांकि, यह मेरी लिनक्स मशीन में काम कर रहा है लेकिन मेरी विंडोज़ मशीन में काम नहीं करता है। काम नहीं करके मेरा मतलब है कि QToolButton मेरे windows machine में दिखाई नहीं दे रहा है लेकिन यह मेरी लिनक्स मशीन (Ubuntu) में दिखाई देता है। मैं इसे और डीबग करने में सक्षम नहीं हूं क्योंकि मैंने कारण समझने के लिए कुछ प्रयोगों की कोशिश की है लेकिन यह काम नहीं कर सका।QToolButton खिड़कियों

मेरे स्रोत फ़ाइल:

#include "tabbar.h" 

TabBar::TabBar(QWidget *parent) : QTabBar(parent) 
{ 
    new_button_ = new QToolButton(this); 
    new_button_->setObjectName(QStringLiteral("AddButton")); 
    new_button_->setText("+"); 
    new_button_->setFixedSize(QSize(20, 20)); 
    connect(new_button_, SIGNAL(released()), this, SLOT(emit_new())); 
    movePlusButton(); 
} 

QSize TabBar::sizeHint(void) const 
{ 
    QSize old = QTabBar::sizeHint(); 
    return QSize(old.width() + 45, old.height()); 
} 

void TabBar::emit_new(void) 
{ 
    emit newClicked(); 
} 

void TabBar::movePlusButton(void) 
{ 
    quint64 totalWidth = 0; 
    for (long i=0; i < count(); i++) 
     totalWidth += tabRect(i).width(); 

    quint64 h = geometry().top(); 
    quint64 tab_height = height(); 
    quint64 w = width(); 

    if (totalWidth > w) 
     new_button_->move(w-40, tab_height - 30); 
    else 
     new_button_->move(totalWidth + 5, tab_height - 30); 
} 

void TabBar::resizeEvent(QResizeEvent *p_evt) 
{ 
    QTabBar::resizeEvent(p_evt); 
    movePlusButton(); 
} 

void TabBar::tabLayoutChange(void) 
{ 
    QTabBar::tabLayoutChange(); 
    movePlusButton(); 
} 

मेरे हैडर फ़ाइल:

#ifndef TABBAR_H 
#define TABBAR_H 

#include <QObject> 
#include <QToolButton> 
#include <QTabBar> 
#include <QResizeEvent> 
#include <QLabel> 

class TabBar : public QTabBar { 
Q_OBJECT 

public: 
    TabBar(QWidget *parent=nullptr); 
    ~TabBar() { } 

    void movePlusButton(void); 


    void resizeEvent(QResizeEvent *p_evt) override; 
    void tabLayoutChange(void) override; 
    QSize sizeHint(void) const override; 

private slots: 
    void emit_new(void); 

signals: 
    void newClicked(void); 

private: 
    QToolButton *new_button_; 
}; 

#endif // TABBAR_H 

संपादित करें:

मैं कुछ और प्रयोगों की कोशिश की और पता करने के लिए QToolButton मिल गया है क्षेत्र टैब के बगल के पीछे छिपा है सलाखों। कृपया स्क्रीनशॉट देखें।

enter image description here

+0

कोड के इंडेंटेशन को ठीक करना चाहते हैं। – tambre

+0

'movePusButton' के अंत में' sizeHint' के अंत में मुझे [QWidget :: UpdateGeometry'] (http://doc.qt.io/qt-5/qwidget.html#updateGeometry) पर कॉल की उम्मीद होगी प्रभावित किया गया इसके अलावा मैं कोई स्पष्ट मुद्दा नहीं देख सकता। 'MovePlusButton' के अंत में 'QTabBar'' के' rect() 'और' new_button_' की 'ज्यामिति() 'को मुद्रित करने के लिए कोड को जोड़ें, यह देखने के लिए कि क्या सभी मान समझते हैं। –

+0

मैंने आपके द्वारा सुझाए गए प्रयासों की कोशिश की है लेकिन यह काम नहीं किया है। क्या आप इसे चलाने की कोशिश कर सकते हैं और क्या गलत है? – abhiarora

उत्तर

3

जाहिर है, आपके आवेदन प्रदर्शन अनुकूलित करने के लिए एक स्टाइलशीट या कुछ का उपयोग करता है और यह आपकी TabBar वर्ग के साथ असंगत है।

अपने कोड डाउनलोड किया गया, एक साधारण मुख्य लिखा है:

#include <QApplication> 
#include <QMainWindow> 
#include "tabbar.h" 

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

    QMainWindow wnd; 

    TabBar* tabBar = new TabBar(&wnd); 
    wnd.setCentralWidget(tabBar); 

    tabBar->addTab("Foo"); 

    wnd.show(); 

    return app.exec(); 
} 

संकलित और Windows पर निष्पादित और मिल गया है कि (क्लासिक और हवाई शैली का परीक्षण): enter image description here

तो जाहिरा तौर पर अपने कोड ठीक है। हालांकि, यदि आपने स्टाइलशीट के माध्यम से QTabBar प्रतिपादन को अनुकूलित किया है (मुझे लगता है कि जब मैं देखता हूं कि यह आपके जीयूआई में कैसा दिखता है), तो आपको अपने कोड को अनुकूलित करने की आवश्यकता हो सकती है (शायद movePlusButton क्योंकि इसमें कुछ मान हार्डकोड किए गए हैं जो वर्तमान डिस्प्ले शैली के साथ असंगत हो सकते हैं):

if (totalWidth > w) 
    new_button_->move(w-40, tab_height - 30); 
else 
    new_button_->move(totalWidth + 5, tab_height - 30); 
+0

इसने कोशिश की है कि आपने अतीत में क्या सुझाव दिया है लेकिन यह काम नहीं करता है। – abhiarora

+0

आपने क्या प्रयास किया?क्या आपने अपनी स्टाइलशीट अक्षम कर दी है? मेरे लिए, आपका प्रश्न गलत तरीके से पूछा गया है। आपको पूछा जाना चाहिए कि "मेरे द्वारा उपयोग की जाने वाली स्टाइलशीट पर विचार करने के लिए मेरा बटन कैसे दिखाना है?" और स्टाइलशीट पोस्ट करें ... क्योंकि मैं शर्त लगाता हूं कि यह आपकी समस्या का मूल कारण है। – jpo38

+0

मैंने स्टाइलशीट को हटा दिया है और आपने जो सुझाव दिया है उसकी कोशिश की है। मैं इसे एक और कोशिश दूंगा और आपको अपडेट कर दूंगा। – abhiarora

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