C++ 如何在C++;?
这与以下问题相同: 我试图将Python代码移植到C++中,但它似乎不起作用。 下面是头文件:C++ 如何在C++;?,c++,qt,qt4,qtabwidget,C++,Qt,Qt4,Qtabwidget,这与以下问题相同: 我试图将Python代码移植到C++中,但它似乎不起作用。 下面是头文件: #include <QTabBar> class HorizontalTabWidget : public QTabBar { Q_OBJECT public: explicit HorizontalTabWidget(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *); QS
#include <QTabBar>
class HorizontalTabWidget : public QTabBar
{
Q_OBJECT
public:
explicit HorizontalTabWidget(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
QSize sizeHint() const;
};
这样做只是为了能够使用tabWidget,因为setTabBar是受保护的。以下是我得到的:
我错过了什么
编辑:
我想创建的是这个,但在顶部有图标,图标下有标签(如在Qt Creator中):
问题应该出在喷漆方法上;检查下面的示例是否适用于您,它应该以QTCreator相同的方式绘制选项卡。我重复使用了原始选项卡样式来完成大部分绘制工作,然后在生成的图像上渲染图标和选项卡文本:
class TestTabBar : public QTabBar
{
public:
explicit TestTabBar(QWidget* parent=0) : QTabBar(parent)
{
setIconSize(QSize(80, 80));
}
protected:
QSize tabSizeHint(int) const
{
return QSize(80, 80);
}
void paintEvent(QPaintEvent *)
{
QStylePainter p(this);
for (int index = 0; index < count(); index++)
{
QStyleOptionTabV3 tab;
initStyleOption(&tab, index);
QIcon tempIcon = tab.icon;
QString tempText = tab.text;
tab.icon = QIcon();
tab.text = QString();
p.drawControl(QStyle::CE_TabBarTab, tab);
QPainter painter;
painter.begin(this);
QRect tabrect = tabRect(index);
tabrect.adjust(0, 8, 0, -8);
painter.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tempText);
tempIcon.paint(&painter, 0, tabrect.top(), tab.iconSize.width(), tab.iconSize.height(), Qt::AlignTop | Qt::AlignHCenter);
painter.end();
}
}
};
class TestTabWidget : public QTabWidget
{
public:
explicit TestTabWidget(QWidget *parent = 0) : QTabWidget(parent)
{
setTabBar(new TestTabBar());
}
};
这在我的ubuntu上运行得很好,希望对你有用,
关于此示例不起作用。导致了一个秋季计划 带上你自己的小编辑的例子 -适用于Windows和VS2008的我的系统qt 4.6.3
class TestTabBar : public QTabBar
{
public:
explicit TestTabBar(QWidget* parent=0) : QTabBar(parent)
{
setIconSize(QSize(58, 68));
}
protected:
QSize tabSizeHint(int) const
{
return QSize(58, 68);
}
void paintEvent(QPaintEvent *)
{
QStylePainter p(this);
for (int index = 0; index < count(); index++)
{
QStyleOptionTabV3 tab;
initStyleOption(&tab, index);
QIcon tempIcon = tabIcon(index);
QString tempText = this->tabText(index);
QRect tabrect = tabRect(index);
tab.icon = QIcon();
tab.text = QString();
p.drawControl(QStyle::CE_TabBarTab, tab);
tabrect.adjust(0, 3, 0, -3);
p.setPen(Qt::black);
p.setFont(QFont("Arial", 7));
p.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tempText );
tempIcon.paint(&p, tabrect, Qt::AlignTop | Qt::AlignHCenter);
this->setTabIcon(index, tempIcon );
this->setTabText( index, tempText);
}
}
};
class TestTabWidget : public QTabWidget
{
public:
explicit TestTabWidget(QWidget *parent = 0) : QTabWidget(parent)
{
setTabBar(new TestTabBar());
}
};
类TestTabBar:public QTabBar
{
公众:
显式TestTabBar(QWidget*parent=0):qtabar(parent)
{
setIconSize(QSize(58,68));
}
受保护的:
QSize tabSizeHint(int)常量
{
返回QSize(58,68);
}
无效paintEvent(QPaintEvent*)
{
QSP(本);
对于(int index=0;index选项卡文本(索引);
QRect-tabrect=tabrect(索引);
tab.icon=QIcon();
tab.text=QString();
p、 drawControl(QStyle::CE_TabBarTab,tab);
tabrect.adjust(0,3,0,-3);
p、 设置笔(Qt::黑色);
p、 setFont(QFont(“Arial”,7));
p、 drawText(tabrect,Qt::AlignBottom | Qt::AlignHCenter,testext);
tempIcon.paint(&p,tabrect,Qt::AlignTop | Qt::AlignHCenter);
此->设置选项卡图标(索引、临时图标);
此->setTabText(索引,文本);
}
}
};
类TestTabWidget:publicQTabWidget
{
公众:
显式TestTabWidget(QWidget*parent=0):QTabWidget(parent)
{
setTabBar(新的TestTabBar());
}
};
瓦西里,感谢您修复双QPainter错误
但是,从paintEvent()中调用setTabIcon()和setTabText()会导致无限递归。记住tab是一个本地对象,所以
tab.text = QString();
不影响tabText()
因此,也可以编写示例,而无需制作临时副本
p.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tabText(index));
tabIcon(index).paint(&p, tabrect, Qt::AlignTop | Qt::AlignHCenter);
你想让它看起来像什么?您对Qt::AlignVCenter的期望是什么?是关于“CustomerList”文本的吗?如果要将其居中,应使用AlignHCenter。如果标签的实际顺序是垂直的,我不会称这个类为“HoriontalTabWidget”。(我认为这种类型通常被称为acoordontab)您可以在由图标定义的QRect上绘制文本,如中所述。如果上一次编辑是当前代码的实际结果,则可以添加painter->rotate(90)作为最后一步。最后一次编辑是我在不更改paintEvent()的情况下使用QTabWidget的屏幕截图。根据您提到的问题:“已解决!只需更改tabSizeHint中的方法sizeHint,效果良好:)”以下是Qt Creator中使用的tab小部件的源代码:为所有选项卡绘制图标并将图标居中对齐,我使用了以下mod:tempIcon.paint(&painter,tabrect.left()+4,tabrect.top()+(tabrect.height()/2)-(tab.iconSize.height()/2),tab.iconSize.width(),tab.iconSize.height());
class TestTabBar : public QTabBar
{
public:
explicit TestTabBar(QWidget* parent=0) : QTabBar(parent)
{
setIconSize(QSize(58, 68));
}
protected:
QSize tabSizeHint(int) const
{
return QSize(58, 68);
}
void paintEvent(QPaintEvent *)
{
QStylePainter p(this);
for (int index = 0; index < count(); index++)
{
QStyleOptionTabV3 tab;
initStyleOption(&tab, index);
QIcon tempIcon = tabIcon(index);
QString tempText = this->tabText(index);
QRect tabrect = tabRect(index);
tab.icon = QIcon();
tab.text = QString();
p.drawControl(QStyle::CE_TabBarTab, tab);
tabrect.adjust(0, 3, 0, -3);
p.setPen(Qt::black);
p.setFont(QFont("Arial", 7));
p.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tempText );
tempIcon.paint(&p, tabrect, Qt::AlignTop | Qt::AlignHCenter);
this->setTabIcon(index, tempIcon );
this->setTabText( index, tempText);
}
}
};
class TestTabWidget : public QTabWidget
{
public:
explicit TestTabWidget(QWidget *parent = 0) : QTabWidget(parent)
{
setTabBar(new TestTabBar());
}
};
tab.text = QString();
p.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tabText(index));
tabIcon(index).paint(&p, tabrect, Qt::AlignTop | Qt::AlignHCenter);