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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание объекта класса по его имени  (Прочитано 6859 раз)
daimon
Гость
« : Июль 23, 2010, 17:24 »

Есть класс My_window, наследник QMainWindow, конструктор стандартный. Как создать объект этого класса по строке с его именем (типа QString "My_window")?
Объект нужно создать через указатель и выделение динамической памяти (QMainWindow *w=new QMainWindow()).
« Последнее редактирование: Июль 23, 2010, 17:26 от daimon » Записан
Sahab
Гость
« Ответ #1 : Июль 23, 2010, 17:48 »

man QMetaType
Код:
 struct MyStruct
 {
     int i;
     ...
 };

 Q_DECLARE_METATYPE(MyStruct)

Код:
 qRegisterMetaType<MyClass>("MyClass");


Код:
 
int id = QMetaType::type("MyClass");
 if (id == 0) {
     void *myClassPtr = QMetaType::construct(id);
     ...
     QMetaType::destroy(id, myClassPtr);
     myClassPtr = 0;
 }
« Последнее редактирование: Июль 23, 2010, 17:51 от Sahab » Записан
daimon
Гость
« Ответ #2 : Июль 23, 2010, 17:56 »

man QMetaType
Код:
 struct MyStruct
 {
     int i;
     ...
 };

 Q_DECLARE_METATYPE(MyStruct)

Код:
 qRegisterMetaType<MyClass>("MyClass");


Код:
 
int id = QMetaType::type("MyClass");
 if (id == 0) {
     void *myClassPtr = QMetaType::construct(id);
     ...
     QMetaType::destroy(id, myClassPtr);
     myClassPtr = 0;
 }
Спсибо, последний код не понятен, объясните.
« Последнее редактирование: Июль 23, 2010, 17:59 от daimon » Записан
daimon
Гость
« Ответ #3 : Июль 23, 2010, 18:06 »

Код
C++ (Qt)
#ifndef CALCULATOR_H
#define CALCULATOR_H
 
#include <QtGui/QMainWindow>
#include "GeneratedFiles/ui_calculator.h"
#include <QMetaType>
 
class Calculator : public QMainWindow
{
Q_OBJECT
 
public:
Calculator(QWidget *parent = 0, Qt::WFlags flags = 0);
~Calculator();
 
private:
Ui::CalculatorClass ui;
};
Q_DECLARE_METATYPE(Calculator)
 
#endif // CALCULATOR_H
ошибка
Код:
1>------ Build started: Project: Calculator, Configuration: Debug Win32 ------
1>Moc'ing calculator.h...
1>Compiling...
1>calculator.cpp
1>c:\base_window\calculator\calculator.h(18) : error C2248: 'QMainWindow::QMainWindow' : cannot access private member declared in class 'QMainWindow'
1>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(206) : see declaration of 'QMainWindow::QMainWindow'
1>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(63) : see declaration of 'QMainWindow'
1>        This diagnostic occurred in the compiler generated function 'Calculator::Calculator(const Calculator &)'
1>moc_calculator.cpp
1>c:\base_window\calculator\generatedfiles\debug\../../calculator.h(18) : error C2248: 'QMainWindow::QMainWindow' : cannot access private member declared in class 'QMainWindow'
1>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(206) : see declaration of 'QMainWindow::QMainWindow'
1>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(63) : see declaration of 'QMainWindow'
1>        This diagnostic occurred in the compiler generated function 'Calculator::Calculator(const Calculator &)'
1>main.cpp
1>c:\base_window\calculator\calculator.h(18) : error C2248: 'QMainWindow::QMainWindow' : cannot access private member declared in class 'QMainWindow'
1>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(206) : see declaration of 'QMainWindow::QMainWindow'
1>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(63) : see declaration of 'QMainWindow'
1>        This diagnostic occurred in the compiler generated function 'Calculator::Calculator(const Calculator &)'
1>Generating Code...
1>Build log was saved at "file://c:\Base_window\Calculator\Debug\BuildLog.htm"
1>Calculator - 3 error(s), 0 warning(s)
2>------ Build started: Project: Base_window, Configuration: Debug Win32 ------
2>Compiling...
2>moc_base_window.cpp
2>c:\base_window\base_window\../Calculator/calculator.h(18) : error C2248: 'QMainWindow::QMainWindow' : cannot access private member declared in class 'QMainWindow'
2>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(206) : see declaration of 'QMainWindow::QMainWindow'
2>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(63) : see declaration of 'QMainWindow'
2>        This diagnostic occurred in the compiler generated function 'Calculator::Calculator(const Calculator &)'
2>main.cpp
2>c:\base_window\base_window\../Calculator/calculator.h(18) : error C2248: 'QMainWindow::QMainWindow' : cannot access private member declared in class 'QMainWindow'
2>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(206) : see declaration of 'QMainWindow::QMainWindow'
2>        c:\qt\4.5.0\include\qtgui\../../src/gui/widgets/qmainwindow.h(63) : see declaration of 'QMainWindow'
2>        This diagnostic occurred in the compiler generated function 'Calculator::Calculator(const Calculator &)'
2>base_window.cpp
2>.\base_window.cpp(18) : error C2511: 'void Base_window::openWidget(QListWidgetItem *)' : overloaded member function not found in 'Base_window'
2>        c:\base_window\base_window\base_window.h(11) : see declaration of 'Base_window'
2>Generating Code...
2>Build log was saved at "file://c:\Base_window\Base_window\Debug\BuildLog.htm"
2>Base_window - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 2 failed, 0 up-to-date, 0 skipped ==========
Записан
Sahab
Гость
« Ответ #4 : Июль 23, 2010, 18:10 »

Цитировать
Any class or struct that has a public default constructor, a public copy constructor, and a public destructor can be registered.
Записан
daimon
Гость
« Ответ #5 : Июль 23, 2010, 18:17 »

Цитировать
Any class or struct that has a public default constructor, a public copy constructor, and a public destructor can be registered.
Организовать это всё в моем классе.
Записан
daimon
Гость
« Ответ #6 : Июль 23, 2010, 19:23 »

Ошибки исправил, как теперь организовать типа конструкцию QMainWindow *w =new QMainWindow();
w->show();
вот только с моим классом
« Последнее редактирование: Июль 23, 2010, 19:45 от daimon » Записан
daimon
Гость
« Ответ #7 : Июль 24, 2010, 11:10 »

Цитата: SABROG,24.7.2010,  08:35
Думаю QMetaType тебе не поможет, он не работает с QObject классами, так как у него конструктор копирования находится в приватной секции.

Можно попробовать другой вариант:

Код
C++ (Qt)
QHash<QString, QMetaObject*>
 
class my_window : public QMainWindow
{
   Q_OBJECT
public:
   Q_INVOKABLE my_window(QWidget* parent = 0);
   ...
};
 
my_window::my_window(QWidget* parent) : QMainWindow(parent)
{
   const QMetaObject* mo = metaObject();
   prototypes[mo->className()] = mo;
}
...
QObject* obj = prototypes["my_window"]->newInstance();
QMainWindow* mw = qobject_cast<QMainWindow*>(obj);
 

К сожалению он требует регистрации мета-объектной структуры каждого нового класса в хеше. Я видел в исходниках Qt алгоритм поиска всех мета-объектных структур для каждого класса, который имеет такую структуру. Там берется всего один QMetaObject и манипуляциями с указателями и смещениями находятся другие. Но это уже хак по-моему.
QHash<QString, QMetaObject*> prototypes?
И еще у меня все нужне классы в разных файлах - куда совать тогда хеш (подключаю инклудом)?
Код
C++ (Qt)
#ifndef BASE_WINDOW_H
#define BASE_WINDOW_H
 
#include <QMainWindow>
#include "ui_base_window.h"
#include <QtGui>
#include "../Calculator/calculator.h"
 
using namespace Ui;
 
 
class Base_window : public QMainWindow, public Base_windowClass
{
   Q_OBJECT
 
public:
   Base_window(QWidget *parent = 0);
   ~Base_window();
public slots:
   void Base_window::openWidget(QListWidgetItem * item)
   {
 
       QVariant w(QMetaType::type("Calculator"));
       //QMainWindow e=reinterpret_cast<QVariant> ( w);
...............
 
 
   }
};
 
#endif // BASE_WINDOW_H
 
На другом форуме подсказали
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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