LINUX.ORG.RU

Свой namespace для библиотеки

 , ,


0

2

Здравствуйте, уважаемые знатоки! Я пишу свою небольшую библиотеку на C++ с использованием Qt и хочу сделать, чтобы она при подключении к другим моим программам не засирала их namespace Ui своими классами. Поясню что есть и что я хочу

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui
{
    class Widget;
}

namespace lib_namespace
{

    class Widget : public QWidget
    {
        Q_OBJECT

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

    private:
        Ui::Widget *ui;
    };

}

#endif // WIDGET_H
//widget.cpp
#include "widget.h"

#include "ui_widget.h"

using namespace lib_namespace;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//main.cpp
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    //Ui::Widget; //сейчас видно пользователю библиотеки
    //lib_namespace::Ui::Widget; // а хотелось бы вместо этого как-то так
    //lib_namespace::DoNotTouchIt::Ui::Widget; // или даже так
    //А еще лучше, кроме lib_namespace::Widget'а ему вообще ни о чем не знать
    QApplication a(argc, argv);
    lib_namespace::Widget w;
    w.show();
    
    return a.exec();

Я тыкался-мыкался с namespace'ами и без ошибок компиляции ничего не получалось.

Полная альтернатива: class UiWidget и class myLibUiWidget — хоть обтыкайся. Что ты к одним только неймспейсам прицепился? Комбинируй с именованиями классов.

deep-purple ★★★★★
()

//lib_namespace::Ui::Widget; // а хотелось бы вместо этого как-то так

не думаю, что так получится

//Ui::Widget; //сейчас видно пользователю библиотеки

Ему видно только forward declaration. У библиотеки есть private и public заголовки. UI-файлу нечего делать в public.

namespace lib_namespace

Хоре мешать стили именования. Если уж начал с LibNamespace, то и предерживайся его.

UVV ★★★★★
()
Ответ на: комментарий от deep-purple

Я не очень понял как таким образом сделать, чтобы class Widget из namespace Ui, который появляется из автогенерируемого ui_widget.h не лез в namespace Ui программы, к которой я подключаю библиотеку.

fghjklld
() автор топика
Ответ на: комментарий от fghjklld

Никак, он же автогенерируемый. А вот до своих яиц ты дотянуться можешь.

deep-purple ★★★★★
()

А если UI часть добавлять не через «aggregation as a pointer», а как-то иначе? Может он будет генерировать что-то более удобное.

xaizek ★★★★★
()

А вот так попробуй:

Ok, I found solution. I renamed class name (via Qt designer) from «MyClass» to «MyNamespace::MyClass». And now uic generates ui_*.h with required namespace. According changelog this feature was added in Qt 4.1, but still undocumented. Should I create bugreport?
https://forum.qt.io/post/338854

EXL ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.