QToolButton 在 windows 中不可见
QToolButton not visible in windows
我派生了 QTabBar
的 class 以使用 QToolButton
实现 "+"
(new tab button
) 按钮(类似于 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
编辑:
我又尝试了几个实验,发现 QToolButton
隐藏在标签栏旁边的区域后面。请参考截图。
显然,您的应用程序使用样式表或其他东西来自定义显示,这与您的 TabBar
class.
不兼容
下载了你的代码,写了一个简单的主程序:
#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 上编译和执行并得到了(测试 classic 和 aero 风格):
显然你的代码没有问题。但是,如果您通过样式表自定义 QTabBar
呈现(当我看到它在您的 GUI 中的外观时我怀疑是什么),您可能需要调整您的代码(可能 movePlusButton
因为它有一些硬编码的值可能与当前显示样式不兼容):
if (totalWidth > w)
new_button_->move(w-40, tab_height - 30);
else
new_button_->move(totalWidth + 5, tab_height - 30);
我派生了 QTabBar
的 class 以使用 QToolButton
实现 "+"
(new tab button
) 按钮(类似于 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
编辑:
我又尝试了几个实验,发现 QToolButton
隐藏在标签栏旁边的区域后面。请参考截图。
显然,您的应用程序使用样式表或其他东西来自定义显示,这与您的 TabBar
class.
下载了你的代码,写了一个简单的主程序:
#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 上编译和执行并得到了(测试 classic 和 aero 风格):
显然你的代码没有问题。但是,如果您通过样式表自定义 QTabBar
呈现(当我看到它在您的 GUI 中的外观时我怀疑是什么),您可能需要调整您的代码(可能 movePlusButton
因为它有一些硬编码的值可能与当前显示样式不兼容):
if (totalWidth > w)
new_button_->move(w-40, tab_height - 30);
else
new_button_->move(totalWidth + 5, tab_height - 30);