Подтвердить что ты не робот

QToolButton не отображается в окнах

Я получил класс QTabBar для реализации кнопки "+" (new tab button) с помощью QToolButton (аналогично google chrome). Тем не менее, он работает на моей машине Linux, но не работает на моей машине Windows. Не работает, я имею в виду, что QToolButton не отображается в моем windows machine, но это видно на моей машине Linux (Ubuntu). Я не могу отлаживать его дальше, поскольку я пробовал несколько экспериментов, чтобы понять причину, но это не сработало.

Мой исходный файл:

#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

EDIT:

Я пробовал несколько экспериментов и узнал, что QToolButton скрывается за областью рядом с вкладками. Пожалуйста, просмотрите снимок экрана.

введите описание изображения здесь

4b9b3361

Ответ 1

По-видимому, ваше приложение использует таблицу стилей или что-то, чтобы настроить отображение, и это несовместимо с вашим классом 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 и получил это (проверенный классический и аэро-стиль): введите описание изображения здесь

Итак, ваш код в порядке. Однако, если вы настроили рендеринг QTabBar через таблицу стилей (что я подозреваю, когда я вижу, как она выглядит в вашем графическом интерфейсе), вам может потребоваться адаптировать ваш код (возможно, movePlusButton, поскольку он имеет некоторые значения, жестко запрограммированные, которые могут быть несовместимы с текущий стиль отображения):

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