0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 4
1

Инициализация класса, унаследованного от QWidget

05.10.2013, 11:24. Показов 1241. Ответов 5
Метки нет (Все метки)

Доброго времени суток. Пожалуйста объясните темному как сделать следующее.
Имеем класс:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class WidgetWrapper: public QWidget{
    protected:
        virtual bool eventFilter(QObject *obj, QEvent *event);
    public:
        WidgetWrapper(QWidget *parent = 0):QWidget(parent){};
        bool  loadWidgetInterface(QString interfaceDiscriptionFile);
};
 
  bool WidgetWrapper::eventFilter(QObject *obj, QEvent *event)
 {
     if (event->type() == QEvent::KeyPress) {
         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
         qDebug("Ate key press %d", keyEvent->key());
         return true;
     } else {
         return QObject::eventFilter(obj, event);
     }
 }
 
bool  WidgetWrapper::loadWidgetInterface(QString interfaceDiscriptionFile){
    QUiLoader loader;
    QFile file(interfaceDiscriptionFile);
    if (!file.open(QFile::ReadOnly))
            return false;
    loader.load(&file);               //ТУТ ЗАГРУЖАЕМ QWidget
    file.close();   
    return true;
}
Собственно, сам вопрос: как сделать так что бы загруженный QWidget инициализировал объект WidgetWrapper
C++ (Qt)
1
2
loader.load(&file, this);  // делает загруженный QWidget дочерним виджетом WidgetWrapper
this = loader.load(&file); // не работает, сыпя ошибками при компиляции
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2013, 11:24
Ответы с готовыми решениями:

Нужно ли самому удалять экземпляр класса, унаследованного от QThread?
Привет! Есть класс, унаследованный от QThread с макросом Q_OBJECT, создаю я этот экземпляр при...

Почему при обращении к методам класса через точку VS показывает в том числе и private методы унаследованного класса?
Есть три класса. Каждый наследует другой с модификатором наследования private. Соответственно...

Почему VS при обращении к методам класса через точку показывает в том числе и private методы унаследованного класса?
Есть два класса. Один наследует другой с модификатором наследования private. Соответственно...

События у унаследованного VCL класса
Здравствуйте. Есть проблемка: Есть класс, унаследованный от TImage. Нужно чтобы, при...

5
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.10.2013, 14:33 2
Непонятен вопрос. Т.е. как добавить загружаемый виджет на WidgetWrapper?
0
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 4
05.10.2013, 14:48  [ТС] 3
Цитата Сообщение от Elboy Посмотреть сообщение
Непонятен вопрос. Т.е. как добавить загружаемый виджет на WidgetWrapper?
Нужно что бы загружаемый виджет стал WidgetWrapper.

Т.е я могу сделать так
C++ (Qt)
1
2
3
QWidget *newWidget = new QWidget;
newWidget  = loader.load(&file);
newWidget ->show();
а необходимо сделать:
C++ (Qt)
1
2
3
WidgetWrapper*newWidget = new WidgetWrapper;
newWidget ->loadWidgetInterface("interface/goodsSelectPage.ui") ;
newWidget ->show();  //Без переопределения метода show(), естественно.
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.10.2013, 15:22 4
C++ (Qt)
1
WidgetWrapper *newWidget = qobject_cast<WidgetWrapper *>(loader.load(&file));
0
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
05.10.2013, 15:23 5
То, что вы хотите, невозможно в таком виде, в котором вы этого хотите. Просто сделайте загруженный виджет дочерним по отношению к врапперу, а в коде враппера обращайтесь к членам загруженного виджета с помощью QObject::findWidget (но не забывайте, что виджета с таким именем может вообще не быть).
0
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 4
07.10.2013, 08:21  [ТС] 6
Сделал следующим образом:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// WidgetWrapper.h
#ifndef WIDGETWRAPPER_H
#define WIDGETWRAPPER_H
 
#include <QtGui>
#include <QtUiTools>
#include <QWidget>
 
class WidgetWrapper: public QWidget{
    Q_OBJECT
    protected:
        virtual bool eventFilter(QObject *obj, QEvent *event);
    public:
        WidgetWrapper(QWidget *parent = 0):QWidget(parent){};
        static WidgetWrapper*  loadWidgetInterface(QString interfaceDiscriptionFile);
};
 
#endif //WIDGETWRAPPER_H

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//WidgetWrapper.cpp
 
#include <WidgetWrapper.h>
 
  bool WidgetWrapper::eventFilter(QObject *obj, QEvent *event)
 {
     if (event->type() == QEvent::KeyPress) {
         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
     qDebug()<<QString("Ate key press %1").arg(keyEvent->key());
         return true;
     } else {
         return QObject::eventFilter(obj, event);
     }
 }
 
 WidgetWrapper*  WidgetWrapper::loadWidgetInterface(QString interfaceDiscriptionFile){
    qDebug()<<QString("Load interface from %1").arg(interfaceDiscriptionFile);
    QUiLoader loader;
    WidgetWrapper *widget;
    QFile file(interfaceDiscriptionFile);
    file.open(QFile::ReadOnly);
    widget = qobject_cast<WidgetWrapper*> (loader.load(&file));
    file.close();   
    return widget;
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//main.cpp
 
#include <QtCore>
#include <WidgetWrapper.h>
 
int main(int argc, char *argv[]) 
{      
    QApplication Application(argc, argv);
 
    WidgetWrapper *firstwidget;
    firstwidget = WidgetWrapper::loadWidgetInterface("interface/goodsSelectPage.ui")  ; 
    firstwidget -> showFullScreen() ;   /**/
 
    
  return Application.exec();
}
Как бы теперь все норм. НО при вызове firstwidget -> showFullScreen() все падает к чертям без объяснения причин. Что это?И как это побороть?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2013, 08:21

Доступ к функциям унаследованного класса
Не знаю как в двух словах описать проблему поэтому если что, модераторы поправьте название темы. У...

Нужно вывести информацию из унаследованного класса
Всем доброго времени суток)) Я недавно начала изучать WindowsForm и столкнулась со следующей...

Как получить данные из унаследованного класса через промежуточный класс?
Есть три класса: Background.cpp: #pragma once class Background { public:

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

Вызвать функцию рисования у класса наследующего QGLWidget из класса наследующего QWidget?
Пишу программу которая моделирует движение обьектов. Класс Display наследуется от QWidget и...

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса)
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.