Создать пользовательский виджет в качестве панели инструментов для QMainWindow

0

Я хочу создать собственный виджет панели инструментов (что-то вроде ленты). Затем я хочу создать 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, это фиксированное положение, чтобы он не мог перемещаться в главное окно.

  • 0
    Конкретный макет главного окна содержит сотни строк кода для работы с панелями инструментов. Вам нужно будет приложить немало усилий, чтобы добиться этого с помощью пользовательского виджета, и я уверен, что на этом пути вы найдете множество препятствий. Мое предложение состоит в том, чтобы настроить QToolBar с помощью CSS или с настраиваемым рисованием, чтобы он выглядел так, как вы хотите, но используйте его функциональность.
  • 0
    Infact я не хочу переписать это. Я хочу только знать, как я могу наследовать QToolbar без этих проблем.
Теги:
qt
toolbar

1 ответ

0

В 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 и это все равно будет плохой практикой.

  • 0
    Может быть, это может быть решением, даже если немного многословно. Я проверю его.
  • 0
    @Jepessen Пожалуйста, сделай это. Я не думаю, что у вас есть другой вариант.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню