crossplatform.ru

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

> Ошибка invalid conversion from `QWidget*' to `QComboBox*'
kvak
  опции профиля:
сообщение 16.9.2010, 11:47
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 5.5.2010
Пользователь №: 1690

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




Репутация:   0  


Имеется:
QComboBox *oe_units;
*PM - объекта собственного класса
*TABLE_ELITE - таблица QTableWidget, которая является данным класса, который представляет объект PM

Не рабоатает вот такая нструкция:
oe_units = PM->TABLE_ELITE->cellWidget(e, f);

Код ошибки:
code\order.cpp:104: error: invalid conversion from `QWidget*' to `QComboBox*'

Задача получить через функцию cellWidget, выполненную для таблицы, которая принадлежит классу,
представленному объектом PM, указатель на тот самый виджет. К этому времени в этой ячейке с адресом
(e, f) находится виджет QComboBox.
Так как функция cellWidget возвращает указатель полученного виджета, то по идее мой указатель oe_units
должен после выполнения инструкции указывать на тот самый виджет. Сам виджет QComboBox не приватный.

В чем тут может быть ошибка ? Правильная ли сама инструкция ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 16.9.2010, 21:50
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(kwisp @ 17.9.2010, 0:42) *
т.е. ты всегда уверен что приведение закончится успешно?

конечно :) Это лишь снятие ответственности с компилятора, который паникует при попытке присвоить адрес объекта типа родителя указателю на объекта типа дитёнка (наоборот можно, он даже не пикнет). Более ничего при этом не происходит


Цитата(kwisp @ 17.9.2010, 0:42) *
та легко.
при освобождении памяти ты даешь delete указатель - как по адресу delete определяет сколько памяти освободить? каков размер обЪекта?

это не пример. Во первых, АДРЕС не поменяется от этого. Во вторых, для таких случаев должен быть виртуальный деструктор, либо ты уж учитывай, какой тип удаляется и приведи его перед удалением

А DEADHUNT говорил
Цитата(DEADHUNT @ 17.9.2010, 0:16) *
адреса вообще-то тоже требуется корректировать


DEADHUNT, в твоём примере адрес не меняется и не корректируется тоже )

я вредное, я знаю... Но пока не увидел убедительных объяснений обязаловки применения каста :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 16.9.2010, 22:06
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(Алексей1153 @ 16.9.2010, 22:50) *
я вредное, я знаю... Но пока не увидел убедительных объяснений обязаловки применения каста :)

Давай смотреть. :)
#include <iostream>

class A
{
    int val1;
};

class B
{
    int val2;
};

class C : public A, public B
{
    int val3;
};

int main()
{
    // Создали объект класса B (он содержит одну(!) переменную типа int)
    B bObj;

    // Спокойно преобразовали ее к типу C, который должен содержать три(!) переменных типа int.
    // Давай попробуем записать и переменные var2 и var3, для которых память не выделялась.
    C *c1 = (C*)&bObj;
    std::cout << (void *)c1 << std::endl;

    // Попробуем тоже с кастом. На этапе компиляции нам скажут, что мы не правы.
    C *c2 = dynamic_cast<C*>( &bObj );
    std::cout << (void *)c2 << std::endl;

    return 0;
}

Сишное преобразование ничего не контролирует, с его помошью я могу преобразовать QString к QWidget, последствия правда будут не хорошие.

Насчет корректировки адреса указателя.
Попробуй с теми же классами выполнить следующие преобразования:
    C c;
    std::cout << (void *)&c << std::endl;
    
    A *a = dynamic_cast<A*>( &c );
    std::cout << (void *)a << std::endl;

    B *b = dynamic_cast<B*>( &c );
    std::cout << (void *)b << std::endl;

И посмотри как будет меняться указатель.
Кстати сишные преобразования тоже так умеют. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- kvak   Ошибка invalid conversion from `QWidget*' to `QComboBox*'   16.9.2010, 11:47
- - Алексей1153   приведи тип указателя (на свой страх и риск - след...   16.9.2010, 11:50
- - molchanoviv   проверь не стоит ли у тебя в oe_units = new QCombo...   16.9.2010, 11:52
- - igor_bogomolov   oe_units = qobject_cast<QComboBox*>(PM...   16.9.2010, 11:55
- - kwisp   Цитата(Алексей1153 @ 16.9.2010, 12:50) oe...   16.9.2010, 12:24
- - Алексей1153   Цитата(kwisp @ 16.9.2010, 15:24) *. не на...   16.9.2010, 12:49
- - kwisp   Цитата(Алексей1153 @ 16.9.2010, 13:49) вс...   16.9.2010, 13:43
- - Алексей1153   Цитата(kwisp @ 16.9.2010, 16:43) тогда мо...   16.9.2010, 14:09
- - kwisp   Цитата(Алексей1153 @ 16.9.2010, 15:09) я ...   16.9.2010, 14:45
- - Litkevich Yuriy   Цитата(kwisp @ 16.9.2010, 16:24) даже в С...   16.9.2010, 14:48
- - kwisp   Цитата(Litkevich Yuriy @ 16.9.2010, 15:48...   16.9.2010, 14:55
|- - kvak   А если в этом случае oe_units = qobject_cast<Q...   16.9.2010, 16:00
- - igor_bogomolov   oe_units будет равна нулю. Не забывай делать прове...   16.9.2010, 16:02
- - Алексей1153   Цитата(Litkevich Yuriy @ 16.9.2010, 17:48...   16.9.2010, 21:10
- - DEADHUNT   Цитата(Алексей1153 @ 16.9.2010, 22:10) во...   16.9.2010, 21:16
- - kwisp   Алексей1153, он тебе вообще про приведение типов ...   16.9.2010, 21:18
- - Алексей1153   Цитата(DEADHUNT @ 17.9.2010, 0:16) адреса...   16.9.2010, 21:28
- - kwisp   Цитата(Алексей1153 @ 16.9.2010, 22:28) не...   16.9.2010, 21:42
- - DEADHUNT   Цитата(Алексей1153 @ 16.9.2010, 22:28) хо...   16.9.2010, 21:46
- - Алексей1153   Цитата(kwisp @ 17.9.2010, 0:42) т.е. ты в...   16.9.2010, 21:50
|- - BRE   Цитата(Алексей1153 @ 16.9.2010, 22:50) я ...   16.9.2010, 22:06
- - kwisp   Цитата(Алексей1153 @ 16.9.2010, 22:49) эт...   16.9.2010, 22:00
- - DEADHUNT   Цитата(BRE @ 16.9.2010, 23:06) Сишное пре...   16.9.2010, 22:10
|- - BRE   Цитата(DEADHUNT @ 16.9.2010, 23:10) в при...   16.9.2010, 22:17
- - kwisp   Цитата(Алексей1153 @ 16.9.2010, 22:50) Но...   16.9.2010, 22:11
- - DEADHUNT   Цитата(BRE @ 16.9.2010, 23:17) Мы говорим...   16.9.2010, 22:27
- - Алексей1153   BRE, ну ты каких-то далёких от реальной жизни извр...   16.9.2010, 22:28
|- - BRE   Цитата(Алексей1153 @ 16.9.2010, 23:28) ук...   16.9.2010, 22:33
- - kwisp   Цитата(Алексей1153 @ 16.9.2010, 23:28) не...   16.9.2010, 22:31
- - Алексей1153   BRE, я такие ошибки не допускаю ) Цитата(kwisp ...   16.9.2010, 22:38


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


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




RSS Текстовая версия Сейчас: 28.1.2025, 21:03