2017-07-21 6 views
10

Ich habe die Klasse QTabBar abgeleitet, um "+" (new tab button) Schaltfläche mit QToolButton (ähnlich wie Google Chrome) zu implementieren. Allerdings funktioniert es in meinem Linux-Rechner, funktioniert aber nicht in meinem Windows-Rechner. Wenn ich nicht arbeite, meine ich QToolButton ist nicht in meinem windows machine sichtbar, aber es ist in meinem Linux-Rechner sichtbar (Ubuntu). Ich bin nicht in der Lage, es weiter zu debuggen, da ich einige Experimente versucht habe, um den Grund zu verstehen, aber es hat nicht funktioniert.QToolButton nicht sichtbar in Windows

Meine Quelldatei:

#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(); 
} 

Mein Header-Datei:

#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 

EDIT:

ich mehr wenige Experimente versucht haben, und bekam QToolButton versteckt sich hinter Region neben Tab wissen Riegel. Bitte beachten Sie den Screenshot.

enter image description here

+0

Möglicherweise möchten Sie die Einrückung des Codes beheben. – tambre

+0

Ich hätte einen Aufruf von ['QWidget :: updateGeometry'] (http://doc.qt.io/qt-5/qwidget.html#updateGeometry) am Ende von' movePlusButton' erwartet, wie der 'sizeHint' war betroffen. Abgesehen davon kann ich kein offensichtliches Problem sehen. Fügen Sie Code am Ende von 'movePlusButton' hinzu, um die' rect() 'von' QTabBar' und 'geometry()' von 'new_button_' auszudrucken, um zu sehen, ob die Werte sinnvoll sind. –

+0

Ich habe versucht, was Sie vorgeschlagen haben, aber es hat nicht funktioniert. Können Sie versuchen, es auszuführen und zu sehen, was falsch ist? – abhiarora

Antwort

3

Anscheinend verwendet Ihre Anwendung ein Stylesheet oder etwas das Display anpassen, und dies ist mit Ihrem TabBar Klasse unvereinbar.

#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(); 
} 

kompiliert und ausgeführt auf Windows und bekam das (klassische und aero Stil getestet):

Code heruntergeladen, ein einfaches Haupt schrieb enter image description here

So offensichtlich ist Ihr Code in Ordnung. Wenn Sie jedoch das QTabBar Rendering über ein Stylesheet anpassen (was ich vermute, wenn ich sehe, wie es in Ihrer GUI aussieht), müssen Sie möglicherweise Ihren Code anpassen (wahrscheinlich movePlusButton, da einige Werte fest codiert sind, die möglicherweise nicht mit dem aktuellen Anzeigestil kompatibel sind)):

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

Es hat versucht, was Sie in der Vergangenheit vorgeschlagen haben, aber es hat nicht funktioniert. – abhiarora

+0

Was hast du probiert?Hast du dein Stylesheet deaktiviert? Für mich wird deine Frage zu Unrecht gestellt. Sie sollten gefragt haben, wie Sie meinen Button unter Berücksichtigung des Stylesheets, das ich verwende, sichtbar machen? und posten Sie das Stylesheet ... weil ich wette, dass das die Ursache Ihres Problems ist. – jpo38

+0

Ich habe das Stylesheet entfernt und versucht, was Sie vorgeschlagen haben. Ich werde es noch einmal versuchen und aktualisieren. – abhiarora