创建自定义窗口小部件作为QMainWindow的工具栏

时间:2014-10-22 13:12:50

标签: c++ qt toolbar

我想创建一个自定义工具栏小部件(类似于功能区)。然后我想创建一个QMainWindow,它使用这个自定义小部件作为工具栏。

我可以做类似

的事情
class RibbonToolbar : public QToolBar {
...
};

...


QMainWindow *window = new QMainWindow();
RibbonToolbar *toolbar = new RibbonToolbar(window);
window->addToolBar(toolbar);

问题在于,RibbonToolbar以这种方式继承了QToolbar中的所有方法,我不想要它,因为我的小部件不使用它们。它是一个全新的小部件。

我想这样做:

class RibbonToolbar : public QWidget {
...
};

因此,如果我以这种方式宣布我的课程,那么将它添加到QMainWindow顶部的最佳方式是什么?

PS:如果调整QMainWindow的大小,可以调整我的小部件,但是,就像Microsoft Office中的功能区一样,它是一个固定的位置,因此它无法移动到主窗口中。

1 个答案:

答案 0 :(得分:0)

C++中,无法从类中删除功能。但是,可以隐藏现有功能。(1)

话虽如此,如何通过声明QToolBar来隐藏private您不想使用的成员函数?

我们以QWidget为例:

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    void setGeometry(const QRect &);
    void setGeometry(int x, int y, int w, int h);
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
}

Widget::~Widget()
{
}

void Widget::setGeometry(const QRect &)
{
}

void Widget::setGeometry(int x, int y, int w, int h)
{
}

在这种情况下,即使setGeometryQWidget的成员函数,也不能再使用Widget。同样,您可以通过将其声明为私有隐藏QToolBar::isMovable并为其提供空实现。

更方便的是声明它们protected,以便在需要时可以从派生类访问它们。

你不能使用AFAIK

class RibbonToolbar : public QWidget {
...
};

因为QMainWindow API是以这样的方式制作的,它只接受指向QToolBar工具栏区域的指针。您可以通过创建与RibbonToolbar二进制兼容的QToolBarreinterpret_cast对象QToolBar*来欺骗它,但是您需要深入了解{Qt的内部胆量。 1}}它仍然是不好的做法。