crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Создание собственного класса для создания других виджетов., Как правильно описать в нем создание QAction?
billy4685
  опции профиля:
сообщение 11.11.2014, 11:54
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 5.5.2014
Пользователь №: 4118

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здраствуйте, господа форумчаны. Столкнулся тут с одной проблемкой. Есть написанный класс
для создания других виджетов. С его помощью получается создать окно, кнопку и меню, но вот
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). Может кто-то знает как избавится от этой ошибки? ну или дельный совет может дать? Буду искренно благодарен.


Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
billy4685
  опции профиля:
сообщение 11.11.2014, 16:20
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 5.5.2014
Пользователь №: 4118

Спасибо сказали: 0 раз(а)




Репутация:   0  


Оказалось были банальные ошибки)) просто не создал wgt типа QAction)) и указал не того родителя в главной функции при создании ACTION.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 0:29