Russian Qt Forum

Qt => Общие вопросы => Тема начата: GraninDm от Май 15, 2012, 15:38



Название: Как правильно сравнить виджеты
Отправлено: GraninDm от Май 15, 2012, 15:38
Добрый день!

Пишу не очень давно, так что возможно ответ достаточно прост, но поиск не помог.

Собственно нужно сравнить два виджета на идентичность (один и тот же или два разных?).
Как это сделать правильно и кроссплатфирменно (lin/win)?
Сравнивать просто как указатели?

Или есть другой подход именно применительно к Qt?


Название: Re: Как правильно сравнить виджеты
Отправлено: Пантер от Май 15, 2012, 15:38
Подробнее опиши задачу.


Название: Re: Как правильно сравнить виджеты
Отправлено: GraninDm от Май 15, 2012, 15:43
Если упрощенно, то так...
Есть объект (q), в котором храниться ссылка на виджет (в частности на QMdiSubWindow)
Есть метод q.test(QMdiSubWindow)
Этот метод должен сравнить сохраненную ссылку с переданной в качестве параметра.
Вот, не знаю как правильно сравнить?


Название: Re: Как правильно сравнить виджеты
Отправлено: V1KT0P от Май 15, 2012, 15:50
Если упрощенно, то так...
Есть объект (q), в котором храниться ссылка на виджет (в частности на QMdiSubWindow)
Есть метод q.test(QMdiSubWindow)
Этот метод должен сравнить сохраненную ссылку с переданной в качестве параметра.
Вот, не знаю как правильно сравнить?
90% ответа уже находится в вопросе. Если проще, то приведи критерии сравнения и все станет ясно.


Название: Re: Как правильно сравнить виджеты
Отправлено: GraninDm от Май 15, 2012, 15:55
Критерий один
Узнать в принципе обе ссылки указывают на один и тот же объект или нет.

Т.е. я правильно понял?
q.savedObject == parWidget

А если более общий случай и будут передаваться объекты разных типов, то к какому типу приводить для сравнения?


Название: Re: Как правильно сравнить виджеты
Отправлено: V1KT0P от Май 15, 2012, 15:58
Критерий один
Узнать в принципе обе ссылки указывают на один и тот же объект или нет.

Т.е. я правильно понял?
q.savedObject == parWidget

А если более общий случай и будут передаваться объекты разных типов, то к какому типу приводить для сравнения?
К QObject-у приводи.


Название: Re: Как правильно сравнить виджеты
Отправлено: sudo от Май 15, 2012, 22:04
Не надо приводить, указатели всё равно одинаковые будут. Это если я топик правильно понял, что вечером далеко не факт  ;D


Название: Re: Как правильно сравнить виджеты
Отправлено: andrew.k от Май 16, 2012, 17:06
Критерий один
Узнать в принципе обе ссылки указывают на один и тот же объект или нет.

Т.е. я правильно понял?
q.savedObject == parWidget

А если более общий случай и будут передаваться объекты разных типов, то к какому типу приводить для сравнения?
Чтобы сравнивать просто указатели типы вообще не нужны.
Чтобы просто сравнивать указатели типы вообще не нужны.


Название: Re: Как правильно сравнить виджеты
Отправлено: Igors от Май 16, 2012, 17:27
Чтобы сравнивать просто указатели типы вообще не нужны.
Чтобы просто сравнивать указатели типы вообще не нужны.
А чего тогда у меня это не компилится?  :)
Код
C++ (Qt)
QWidget * w = 0;
QGraphicsItem * e = 0;
if (w == e) return 1;
 


Название: Re: Как правильно сравнить виджеты
Отправлено: Igors от Май 16, 2012, 17:28
Не надо приводить, указатели всё равно одинаковые будут.
Строго говоря нет  :)


Название: Re: Как правильно сравнить виджеты
Отправлено: V1KT0P от Май 16, 2012, 17:34
Не надо приводить, указатели всё равно одинаковые будут.
Строго говоря нет  :)
Где можно про это почитать. Меня что-то заинтересовало как располагается информация наследованных классов, особенно множественное наследование. Это вроде где-то в стандарте должно быть написано...


Название: Re: Как правильно сравнить виджеты
Отправлено: Igors от Май 16, 2012, 17:55
Где можно про это почитать. Меня что-то заинтересовало как располагается информация наследованных классов, особенно множественное наследование. Это вроде где-то в стандарте должно быть написано...
Совершенно верно, при множественном наследовании возможно такое
Код
C++ (Qt)
bool eq = (c == b);         // eq = true
bool eq2 = ((void *) c == (void *) b);  // eq2 = false
 
В данном случае не вижу зачем штудировать стандарт - в отладчике все прекрасно видно


Название: Re: Как правильно сравнить виджеты
Отправлено: GreatSnake от Май 16, 2012, 18:14
Код
C++ (Qt)
bool eq = (c == b);         // eq = true
bool eq2 = ((void *) c == (void *) b);  // eq2 = false
 
Не мешало бы озвучить что такое c и b :)

Не надо приводить, указатели всё равно одинаковые будут.
Строго говоря нет  :)
Если база у них общая, то строго говоря да :)


Название: Re: Как правильно сравнить виджеты
Отправлено: V1KT0P от Май 16, 2012, 18:22
Если база у них общая, то строго говоря да :)
Во во, а если множественное наследование, то баз уже как минимум =).
В данном случае не вижу зачем штудировать стандарт - в отладчике все прекрасно видно
Просто интересно узнать в каком видео оно там находится.


Название: Re: Как правильно сравнить виджеты
Отправлено: Igors от Май 16, 2012, 18:35
Не мешало бы озвучить что такое c и b :)
Да запросто
Код
C++ (Qt)
#include <stdio.h>
 
struct A {
int a;
};
 
struct B {
int b;
};
 
struct C : public A, public B {
int c;
};
 
int main( void )
{
C * c = new C;
B * b = c;
bool eq = (c == b);
bool eq2 = ((void *) c == (void *) b);
printf("eq = %d, eq2 = %d\n", int(eq), int(eq2));
return 0;
}
 

Если база у них общая, то строго говоря да :)
Ну батенька, что ж у Вас за "строго" такое  :)

Просто интересно узнать в каком видео оно там находится.
Исходите из соображения что приведение "вмонтированного" (b в примере выше) должно вернуть тот же самый экземпляр как если бы он был просто создан "сам" (ну почти, VMT разные)