【问题标题】:QToolButton not visible in windowsQToolButton 在窗口中不可见
【发布时间】:2017-07-21 07:39:30
【问题描述】:

我已经派生了QTabBar 的类来使用QToolButton(类似于谷歌浏览器)实现"+" (new tab button) 按钮。但是,它在我的 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

编辑:

我尝试了更多的实验,发现QToolButton 隐藏在标签栏旁边的区域后面。请参考截图。

【问题讨论】:

  • 可能要修复代码的缩进。
  • 我本来希望在movePlusButton 结束时调用QWidget::updateGeometry,因为sizeHint 已受到影响。除此之外,我看不到任何明显的问题。在movePlusButton 的末尾添加代码以打印出QTabBarrect()new_button_geometry(),看看这些值是否都有意义。
  • 我已经尝试了您的建议,但没有奏效。可以试试运行看看有什么问题吗?
  • 您是否按照我的建议输出并检查了几何图形?
  • @abhiarora:您是否为您的应用程序使用任何样式表?因为我编译了您的代码并在标准 QMainWindow 中显示了您的 TabBar,并且“+”按钮正确显示并按预期运行。

标签: c++ windows qt qtabbar qtoolbutton


【解决方案1】:

显然,您的应用程序使用样式表或其他东西来自定义显示,这与您的 TabBar 类不兼容。

下载了你的代码,写了一个简单的main:

#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 呈现(当我看到它在您的 GUI 中的外观时我怀疑),您可能需要调整您的代码(可能是 movePlusButton,因为它有一些硬编码的值可能与当前显示样式):

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

【讨论】:

  • 它已经尝试过您过去的建议,但没有成功。
  • 你尝试了什么?您是否禁用了样式表?对我来说,你的问题问错了。您应该问“考虑到我使用的样式表,如何使我的按钮可见?”并发布样式表...因为我敢打赌这是您问题的根本原因。
  • 我已删除样式表并尝试了您的建议。我会再试一次并更新你。
  • 首先想到的是在删除样式表后检查按钮是否正常。它应该,正如我在 Windows 下使用您的代码时看到的那样正确显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2013-04-22
相关资源
最近更新 更多