我通过QLineEdit动态插入标签,效果很好。要填充整个屏幕宽度(800px),我使用自己的eventFilter展开标签:
tabs.h
class ResizeFilter : public QObject
{
QTabBar *target_tabs;
public:
ResizeFilter(QTabBar *target_tabs) : QObject(target_tabs), target_tabs(target_tabs) {}
bool eventFilter(QObject *object, QEvent *event)
{
if (object == target_tabs) {
if (event->type() == QEvent::Resize)
{
// The width of each tab is the width of the tabbar / # of tabs.
target_tabs).arg(target_tabs->size().width()/target_tabs->count()));
}
}
return false;
}
};
class tabs : public QWidget
{
Q_OBJECT
private:
QTabBar *cells;
};
tabs.cpp
void tabs::changeTabs(int value)
{
tabs->installEventFilter(new ResizeFilter(tabs));
if (tabs->count() < value)
tabs->insertTab(tabs->count(), QIcon(QString("")), QString::number(value));
}
运行应用后,一个标签始终可见并正确展开。如上所述,最大宽度设置为800像素。添加新选项卡工作正常,但resize事件会影响尺寸标注。让我们说我添加了第二个标签,它在第一个标签旁边显示800px,而不是缩放800px内的两个标签(每个400/400像素)。
看起来像这样: wrong insertion
它实际应该是这样的: how it's supposed to be
我在这里做错了什么?
答案 0 :(得分:1)
您正在选项卡上设置尺寸,而不是在QTabBar上设置尺寸。很明显,新标签将采用设定的宽度,直到调整大小为止。
您可以继承QTabBar
并同时实施resizeEvent
和tabInserted
,这也会使您的eventFilter
变得多余。
示例代码:
class CustomTabBar : public QTabBar
{
public:
CustomTabBar(QWidget *parent = Q_NULLPTR)
: QTabBar(parent)
{
}
protected:
void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE
{
/*resize handler*/
}
void tabInserted(int index) Q_DECL_OVERRIDE
{
/*new tab handler*/
}
void tabRemoved(int index) Q_DECL_OVERRIDE
{
/*tab removed handler*/
}
};