Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_Qt_Qt4_Qtabwidget - Fatal编程技术网

C++ 如何在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

这与以下问题相同:

我试图将Python代码移植到C++中,但它似乎不起作用。 下面是头文件:

#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);