c ++ - QToolButton ikke synlig i Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har afledt klassen QTabBar for at implementere "+" (new tab button) knappen ved hjælp af QToolButton (svarende til Google Chrome). Det virker dog i min Linux-maskine, men fungerer ikke i min Windows-maskine. Ved ikke at arbejde mener jeg QToolButton er ikke synlig i min windows machine, men den er synlig i min Linux-maskine ([[Ubuntu). Jeg kan ikke debugere det yderligere, da jeg har forsøgt få eksperimenter til at forstå årsagen, men det virkede ikke.


Min kildefil:


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


Min overskriftsfil:


#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


REDIGERE:


Jeg har forsøgt få flere eksperimenter og fik at vide QToolButton gemmer sig bag regionen ved siden af ​​fanebladene. Se venligst screenshotet.


Indtast billedbeskrivelse her [16]

Bedste reference


Tilsyneladende bruger din applikation et stylesheet eller noget til at tilpasse skærmen, og dette er uforeneligt med din TabBar klasse.


Downloadet din kode, skrev en simpel hoved:


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


kompileret og udført på Windows og fik det (testet klassisk og aero stil):
Indtast billedbeskrivelse her [17]


Så åbenbart din kode er fint. Men hvis du tilpassede QTabBar -gengivelsen gennem et stylesheet (hvad jeg formoder, når jeg ser hvordan det ser ud i dit GUI), skal du muligvis tilpasse din kode (sandsynligvis movePlusButton, da det har nogle værdier, der er hardkodede kan være uforenelig med den aktuelle visningsstil):


if (totalWidth > w)
    new\_button\_->move(w-40, tab\_height - 30);
else
    new\_button\_->move(totalWidth + 5, tab\_height - 30);