Russian Qt Forum

Qt => Вопросы новичков => Тема начата: unkeep от Июль 26, 2013, 09:47



Название: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: unkeep от Июль 26, 2013, 09:47
хочу весь свой проект поместить в namespace TextDocumentEditor. Объясните пожалуйста, что я делаю не так.

MainWidget.h
Код
C++ (Qt)
#pragma once;
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
 
#include <QWidget>
 
namespace TextDocumentEditor {
namespace Ui {
class MainWidget;
}
 
 
class MainWidget : public QWidget
{
   Q_OBJECT
 
public:
   explicit MainWidget(QWidget *parent = 0);
   ~MainWidget();  
private:
   Ui::MainWidget *_ui;
};
}
#endif // MAINWIDGET_H



MainWidget.cpp
Код
C++ (Qt)
#include "MainWidget.h"
#include "ui_MainWidget.h"
using namespace TextDocumentEditor;
 
MainWidget::MainWidget(QWidget *parent) :
   QWidget(parent),
   _ui(new Ui::MainWidget)
{
   _ui->setupUi(this);
}
 
 
MainWidget::~MainWidget()
{
   delete _ui;
}

ошибка: C2512: 'TextDocumentEditor::Ui::MainWidget' : no appropriate default constructor available


Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: mutineer от Июль 26, 2013, 10:14
Реализация Ui::MainWidget не знает ничего про неймспейс


Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: unkeep от Июль 26, 2013, 10:19
Реализация Ui::MainWidget не знает ничего про неймспейс
пробовал так
TextDocumentEditor::Ui::MainWidget
- тоже самое
и вообще по моей логике, если я в .cpp написал  using namespace TextDocumentEditor значит все определения из этого неймспейса должны быть доступны. Или не так?


Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: Igors от Июль 26, 2013, 10:36
и вообще по моей логике, если я в .cpp написал  using namespace TextDocumentEditor значит все определения из этого неймспейса должны быть доступны. Или не так?
Так, но для тех что объявлены в namespace

Код
C++ (Qt)
namespace TextDocumentEditor {
namespace Ui {
 
class MainWidget : public QWidget
{
...
};
 
}  // UI
}  // TextDocumentEditor


Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: mutineer от Июль 26, 2013, 10:39
В файле ui_MainWidget.h нет упоминаний твоего неймспейса
попробуй обернуть #include "ui_MainWidget.h" в namespace TextDocumentEditor {}


Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: unkeep от Июль 26, 2013, 11:15
В файле ui_MainWidget.h нет упоминаний твоего неймспейса
попробуй обернуть #include "ui_MainWidget.h" в namespace TextDocumentEditor {}
так - синтаксическая ошибка
Код
C++ (Qt)
namespace TextDocumentEditor {#include "ui_MainWidget.h" }
оборачивать в namespace TextDocumentEditor внутри ui_MainWidget.h нельзя(после пересборки сгенерируется заново)

сделал так
Код
C++ (Qt)
namespace Ui {
class MainWidget;
}
 
namespace TextDocumentEditor {
class MainWidget : public QWidget
{
   Q_OBJECT
public:
   explicit MainWidget(QWidget *parent = 0);
   ~MainWidget();
private:
   Ui::MainWidget *_ui;
};
}
вместо так
Код
C++ (Qt)
namespace TextDocumentEditor {
namespace Ui {
class MainWidget;
}
 
 
class MainWidget : public QWidget
{
   Q_OBJECT
public:
   explicit MainWidget(QWidget *parent = 0);
   ~MainWidget();
private:
   Ui::MainWidget *_ui;
};
}

работает, тока мне хотелось чтоб и ::Ui был внутри ::TextDocumentEditor(если мой проект входит в состав более крупного например, в котором тоже есть namespace Ui).

 И ещё немного не понимаю зачем строчка class MainWidget  отдельно в ::Ui, а не весь class MainWidget с его структурой...(



Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: Bepec от Июль 26, 2013, 12:07
Имеется ещё один способ объявления ui.

Вот к примеру мой класс

Код:
#ifndef DEBUGGER_H
#define DEBUGGER_H

#include <QtGui/QWidget>
#include "ui_debugger.h"
#include <windows.h>
#include <QMap>
#include <QDebug>

class Debugger : public QWidget
{
Q_OBJECT

public:
Debugger(QWidget *parent = 0, Qt::WFlags flags = 0);
~Debugger();

private:
Ui::DebuggerClass ui;
bool winEvent ( MSG * message, long * result );
QMap<long, QString> mapWinMessage;
};

#endif // DEBUGGER_H
Спокойно упихивается в любой namespace.

Довольно давно возникал похожий вопрос. Там и приводился ваш код (он генерится Qt creator' ом, насколько я помню). И именно из-за этого неймспейса он неудобен.

Мой класс сгенерирован QtAddin и не требует никаких дополнительных телодвижений для неймспейсов.

PS надеюсь я правильно понял тему.


Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: kambala от Июль 26, 2013, 12:16
Там и приводился ваш код (он генерится Qt creator' ом, насколько я помню). И именно из-за этого неймспейса он неудобен.

Мой класс сгенерирован QtAddin и не требует никаких дополнительных телодвижений для неймспейсов.
в креаторе можно настроить каким образом включать ui: агрегация (как у тебя), агрегация через указатель (как у ТС) и множественное наследование.


Название: Re: помогите разобраться с неймспейсами(namespace)
Отправлено: unkeep от Сентябрь 26, 2013, 09:30
если кому то ещё интересно, то чтобы включить ::Ui(неймспейс сгенеренного скрытого класса формы) в свой неймспейс, надо при создании формы в мастере QT креатора указывать имя нового класса формы уже с неймспейсом. То есть так MyNamespace::MyWidget. Имена файлов оставить как есть(MyWidget.h/.cpp/.ui).
Тогда  ::Ui уже будет обвёрнут в ::MyNamespace.


Название: Re: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: Qlab от Декабрь 22, 2013, 22:17
Подскажите, как изменить этот код, чтоб работал, т.е. была свяЗь между ui и классом.

ошибка: C2512: 'Ui::Glass' : no appropriate default constructor available
Класс, который сгенерировал креатор, такой ошибки не выдает, запускается и работает нормально.

Код:
#ifndef GLASS_H
#define GLASS_H
#include<QFrame>
#include <QColor>

namespace Ui
{
    class Glass;
}

class Glass : public QFrame
{
    Q_OBJECT
    Q_PROPERTY(unsigned int m_rows READ isReadRows WRITE setWriteRows)
    Q_PROPERTY(unsigned int m_columns READ isReadColumns WRITE setWriteColumns)

public:
    explicit Glass(QWidget *parent = 0);
    unsigned int isReadRows();
    void setWriteRows(unsigned int);
    unsigned int isReadColumns();
    void setWriteColumns(unsigned int);
    bool isStarted;
   virtual ~Glass();
protected:
    void paintEvent(QPaintEvent *event);
private:
    bool GameOn;
    unsigned int m_rows;
    unsigned int m_columns;
    //QColor* glass;
    //Figure* CurrentFigure;
    //Figure* NextFigure;
    unsigned int Account;
    static const unsigned int FieldSize = 10;
    Ui::Glass *ui;
signals:
    void initGlass();
public slots:
    void doInit();

};

#endif // GLASS_H


Код:
#include "glass.h"
//#include "ui_mainwindow.h"
#include <QWidget>

Glass::Glass(QWidget *parent): QFrame(parent), ui(new Ui::Glass)
{
    GameOn = false;
    m_rows = 0;
    m_columns = 0;
    QColor* glass;
    //Figure* CurrentFigure;
    //Figure* NextFigure;
    Account  = 0;
    isStarted = false;
    ui->setupUi(this);
};

Glass::~Glass()
{
    delete ui;
};
unsigned int Glass::isReadRows()
{
    return m_rows;
};
void Glass::setWriteRows(unsigned int rows)
{
    m_rows = rows;
};
unsigned int Glass::isReadColumns()
{
    return m_columns;
};
void Glass::setWriteColumns(unsigned int columns)
{
    m_columns = columns;
};

//void Glass::initGlass()
//{

//};

void Glass::doInit()
{
    bool GlassElements[10][20] = {false};
};

void Glass::paintEvent(QPaintEvent *event)
{
     QFrame::paintEvent(event);
     //QPainter painter(this);
}



Название: Re: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: gil9red от Декабрь 22, 2013, 22:40
Код:
#include "glass.h"
#include "ui_glass.h"
#include <QWidget>
:)


Название: Re: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: Qlab от Декабрь 22, 2013, 23:19
#include "ui_glass.h"
такого нет. Компилятор говорит
 ошибка: C1083: Cannot open include file: 'ui_glass.h': No such file or directory


Название: Re: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: gil9red от Декабрь 22, 2013, 23:23
мос должен был для файла ui сгенерировать файлик #include "ui_<название класса>.h", без этого файла воспользоваться статично формой не выйдет :)
обычно файл генерируется в папке build-.*

Может, у вас вот с таким названием "ui_Glass.h" генерируется...


Название: Re: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: kambala от Декабрь 22, 2013, 23:25
мос
этим занимается uic


Название: Re: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: gil9red от Декабрь 22, 2013, 23:26
точно! :)


Название: Re: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)
Отправлено: Qlab от Декабрь 23, 2013, 00:46
автоматически генерируется файл, который соответствует форме mainwindow.ui  "ui_mainwindow.h" такой файл создается в папке с build. Я пытался обратиться к объекту формы из другого класса.