Здраствуйте, господа форумчаны. Столкнулся тут с одной проблемкой. Есть написанный класс
для создания других виджетов. С его помощью получается создать окно, кнопку и меню, но вот
QAction добавить в меню никак не получается
. Код, который мною написан ниже компилируется
и собирается.
#include "mywidget.h"
int main(int argc, char *argv[]){
QApplication app(argc, argv);
MyWidget *base;
base = new MyWidget(NULL, DIALOG);
base->set_pos(40, 40);
base->set_size(200, 200);
base->set_str("My class widget");
base->reliase();
MyWidget *button;
button = new MyWidget(base, BUTTON);
button->set_pos(20, 20);
button->set_size(80, 28);
button->set_str("Button");
button->reliase();
MyWidget *menu;
menu = new MyWidget(button, MENU);
menu->set_size(80, 80);
menu->set_str("Menu");
MyWidget *action;
action = new MyWidget(button, ACTION);
action->set_str("Action1");
return app.exec();
}
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QtGui>
#include <QWidget>
#include "stdio.h"
#include "stdlib.h"
#define DIALOG 1
#define BUTTON 2
#define MENU 3
#define ACTION 4
class MyWidget
{
public:
QWidget *wgt;
unsigned ra_wgt_type, rawgt_from_wgt_f;
MyWidget(void *widget);
MyWidget(MyWidget *parent, unsigned wgt_type);
void create(void *parent, unsigned wgt_type, int x, int y, int w, int h);
~MyWidget();
void set_pos(int x, int y);
void set_size(int w, int h);
void set_str(const char *str);
void reliase(void);
};
#endif // MYWIDGET_H
#include "mywidget.h"
MyWidget::MyWidget(void *widget)
{
rawgt_from_wgt_f = 1;
wgt = (QWidget *)widget;
if(wgt->metaObject()->className() == QString("QDialog"))
ra_wgt_type = DIALOG;
else if(wgt->metaObject()->className() == QString("QPushButton"))
ra_wgt_type = BUTTON;
else if(wgt->metaObject()->className() == QString("QMenu"))
ra_wgt_type = MENU;
else if(wgt->metaObject()->className() == QString("QAction"))
ra_wgt_type = ACTION;
}
MyWidget::MyWidget(MyWidget *parent, unsigned wgt_type)
{
rawgt_from_wgt_f = 0;
if(parent == NULL)
create(NULL, wgt_type, 0, 0, 0, 0);
else
create(parent->wgt, wgt_type, 0, 0, 0, 0);
}
void MyWidget::create(void *parent, unsigned wgt_type, int x, int y, int w, int h)
{
ra_wgt_type = wgt_type;
QPoint pos(x, y);
QSize size(w, h);
if(wgt_type == DIALOG)
wgt = (QWidget *) new QDialog((QWidget *)parent);
else if(wgt_type == BUTTON)
wgt = (QWidget *) new QPushButton((QWidget *)parent);
else if(wgt_type == MENU)
{
wgt = (QWidget *) new QMenu((QWidget *)parent);
if(((QWidget *)parent)->metaObject()->className() == QString("QPushButton"))
qobject_cast<QPushButton *>((QWidget *)parent)->setMenu(qobject_cast<QMenu *>(wgt));
if(((QWidget *)parent)->metaObject()->className() == QString("QMenu"))
qobject_cast<QMenu *>((QWidget *)parent)->addMenu(qobject_cast<QMenu *>(wgt));
if(((QWidget *)parent)->metaObject()->className() == QString("QAction"))
qobject_cast<QAction *>((QWidget *)parent)->setMenu(qobject_cast<QMenu *>(wgt));
}
else if(wgt_type == ACTION)
{
if(((QWidget *)parent)->metaObject()->className() == QString("QPushButton"))
qobject_cast<QPushButton *>((QWidget *)parent)->addAction(qobject_cast<QAction *>(wgt));
if(((QWidget *)parent)->metaObject()->className() == QString("QMenu"))
qobject_cast<QMenu *>((QWidget *)parent)->addAction(qobject_cast<QAction *>(wgt));
}
}
MyWidget::~MyWidget()
{
if(rawgt_from_wgt_f == 0)
delete wgt;
wgt = NULL;
}
void MyWidget::set_pos(int x, int y)
{
QPoint pos(x, y);
wgt->move(pos);
}
void MyWidget::set_size(int w, int h)
{
wgt->setFixedSize(w, h);
}
void MyWidget::set_str(const char *str)
{
if(str == NULL)
{
return;
}
else{
if(ra_wgt_type == DIALOG)
qobject_cast<QDialog *>(wgt)->setWindowTitle(str);
else if(ra_wgt_type == BUTTON)
qobject_cast<QPushButton *>(wgt)->setText(str);
else if(ra_wgt_type == MENU)
qobject_cast<QMenu *>(wgt)->setTitle(str);
else if(ra_wgt_type == ACTION)
qobject_cast<QAction *>(wgt)->setText(str);
}
}
void MyWidget::reliase(void)
{
wgt->show();
}
Но вот при запуске приложения выдает ошибку о невозможности чтения памяти: снимок ошибки прикрепил ниже (error.jpg). Может кто-то знает как избавится от этой ошибки? ну или дельный совет может дать? Буду искренно благодарен.
Эскизы прикрепленных изображений