Я хочу создать собственный виджет панели инструментов (что-то вроде ленты). Затем я хочу создать 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, это фиксированное положение, чтобы он не мог перемещаться в главное окно.
В C++
невозможно удалить функциональность из класса. Однако можно скрыть существующие функции. (1)
Как говорится, как насчет того, чтобы скрывать QToolBar
члены 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)
{
}
В этом случае, хотя setGeometry
является функцией-членом QWidget
, вы больше не сможете использовать его в Widget
. Аналогично, вы можете скрыть QToolBar::isMovable
, объявив его приватным и предоставить для него пустую реализацию.
Также удобнее было бы объявить их protected
чтобы они были доступны из производных классов, если хотите.
AFAIK вы не можете использовать
class RibbonToolbar : public QWidget {
...
};
потому что QMainWindow
API создан таким образом, что он будет принимать только указатели на QToolBar
для своих областей панели инструментов. Вы можете обмануть его, создав RibbonToolbar
который является двоичным, совместимым с QToolBar
и reinterpret_cast
для объекта с QToolBar*
но тогда вам нужно будет глубоко узнать внутреннюю кишку Qt
и это все равно будет плохой практикой.