Russian Qt Forum
Ноябрь 26, 2024, 19:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] помогите разобраться с неймспейсами (или как обвернуть ::Ui)  (Прочитано 9160 раз)
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
« Последнее редактирование: Сентябрь 26, 2013, 09:32 от unkeep » Записан
mutineer
Гость
« Ответ #1 : Июль 26, 2013, 10:14 »

Реализация Ui::MainWidget не знает ничего про неймспейс
Записан
unkeep
Гость
« Ответ #2 : Июль 26, 2013, 10:19 »

Реализация Ui::MainWidget не знает ничего про неймспейс
пробовал так
TextDocumentEditor::Ui::MainWidget
- тоже самое
и вообще по моей логике, если я в .cpp написал  using namespace TextDocumentEditor значит все определения из этого неймспейса должны быть доступны. Или не так?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 26, 2013, 10:36 »

и вообще по моей логике, если я в .cpp написал  using namespace TextDocumentEditor значит все определения из этого неймспейса должны быть доступны. Или не так?
Так, но для тех что объявлены в namespace

Код
C++ (Qt)
namespace TextDocumentEditor {
namespace Ui {
 
class MainWidget : public QWidget
{
...
};
 
}  // UI
}  // TextDocumentEditor
Записан
mutineer
Гость
« Ответ #4 : Июль 26, 2013, 10:39 »

В файле ui_MainWidget.h нет упоминаний твоего неймспейса
попробуй обернуть #include "ui_MainWidget.h" в namespace TextDocumentEditor {}
Записан
unkeep
Гость
« Ответ #5 : Июль 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 с его структурой...(

« Последнее редактирование: Июль 26, 2013, 12:01 от unkeep » Записан
Bepec
Гость
« Ответ #6 : Июль 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 надеюсь я правильно понял тему.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июль 26, 2013, 12:16 »

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

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
unkeep
Гость
« Ответ #8 : Сентябрь 26, 2013, 09:30 »

если кому то ещё интересно, то чтобы включить ::Ui(неймспейс сгенеренного скрытого класса формы) в свой неймспейс, надо при создании формы в мастере QT креатора указывать имя нового класса формы уже с неймспейсом. То есть так MyNamespace::MyWidget. Имена файлов оставить как есть(MyWidget.h/.cpp/.ui).
Тогда  ::Ui уже будет обвёрнут в ::MyNamespace.
« Последнее редактирование: Сентябрь 26, 2013, 09:35 от unkeep » Записан
Qlab
Гость
« Ответ #9 : Декабрь 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);
}

Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Декабрь 22, 2013, 22:40 »

Код:
#include "glass.h"
#include "ui_glass.h"
#include <QWidget>
Улыбающийся
Записан

Qlab
Гость
« Ответ #11 : Декабрь 22, 2013, 23:19 »

#include "ui_glass.h"
такого нет. Компилятор говорит
 ошибка: C1083: Cannot open include file: 'ui_glass.h': No such file or directory
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Декабрь 22, 2013, 23:23 »

мос должен был для файла ui сгенерировать файлик #include "ui_<название класса>.h", без этого файла воспользоваться статично формой не выйдет Улыбающийся
обычно файл генерируется в папке build-.*

Может, у вас вот с таким названием "ui_Glass.h" генерируется...
« Последнее редактирование: Декабрь 22, 2013, 23:25 от gil9red » Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Декабрь 22, 2013, 23:25 »

мос
этим занимается uic
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Декабрь 22, 2013, 23:26 »

точно! Улыбающийся
Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.231 секунд. Запросов: 23.