Russian Qt Forum
Ноябрь 26, 2024, 00:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно сравнить виджеты  (Прочитано 7371 раз)
GraninDm
Гость
« : Май 15, 2012, 15:38 »

Добрый день!

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

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

Или есть другой подход именно применительно к Qt?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 15, 2012, 15:38 »

Подробнее опиши задачу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GraninDm
Гость
« Ответ #2 : Май 15, 2012, 15:43 »

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

Если упрощенно, то так...
Есть объект (q), в котором храниться ссылка на виджет (в частности на QMdiSubWindow)
Есть метод q.test(QMdiSubWindow)
Этот метод должен сравнить сохраненную ссылку с переданной в качестве параметра.
Вот, не знаю как правильно сравнить?
90% ответа уже находится в вопросе. Если проще, то приведи критерии сравнения и все станет ясно.
Записан
GraninDm
Гость
« Ответ #4 : Май 15, 2012, 15:55 »

Критерий один
Узнать в принципе обе ссылки указывают на один и тот же объект или нет.

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

А если более общий случай и будут передаваться объекты разных типов, то к какому типу приводить для сравнения?
Записан
V1KT0P
Гость
« Ответ #5 : Май 15, 2012, 15:58 »

Критерий один
Узнать в принципе обе ссылки указывают на один и тот же объект или нет.

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

А если более общий случай и будут передаваться объекты разных типов, то к какому типу приводить для сравнения?
К QObject-у приводи.
Записан
sudo
Гость
« Ответ #6 : Май 15, 2012, 22:04 »

Не надо приводить, указатели всё равно одинаковые будут. Это если я топик правильно понял, что вечером далеко не факт  Смеющийся
Записан
andrew.k
Гость
« Ответ #7 : Май 16, 2012, 17:06 »

Критерий один
Узнать в принципе обе ссылки указывают на один и тот же объект или нет.

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

А если более общий случай и будут передаваться объекты разных типов, то к какому типу приводить для сравнения?
Чтобы сравнивать просто указатели типы вообще не нужны.
Чтобы просто сравнивать указатели типы вообще не нужны.
« Последнее редактирование: Май 16, 2012, 17:11 от andrew.k » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Май 16, 2012, 17:27 »

Чтобы сравнивать просто указатели типы вообще не нужны.
Чтобы просто сравнивать указатели типы вообще не нужны.
А чего тогда у меня это не компилится?  Улыбающийся
Код
C++ (Qt)
QWidget * w = 0;
QGraphicsItem * e = 0;
if (w == e) return 1;
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Май 16, 2012, 17:28 »

Не надо приводить, указатели всё равно одинаковые будут.
Строго говоря нет  Улыбающийся
Записан
V1KT0P
Гость
« Ответ #10 : Май 16, 2012, 17:34 »

Не надо приводить, указатели всё равно одинаковые будут.
Строго говоря нет  Улыбающийся
Где можно про это почитать. Меня что-то заинтересовало как располагается информация наследованных классов, особенно множественное наследование. Это вроде где-то в стандарте должно быть написано...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Май 16, 2012, 17:55 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Май 16, 2012, 18:14 »

Код
C++ (Qt)
bool eq = (c == b);         // eq = true
bool eq2 = ((void *) c == (void *) b);  // eq2 = false
 
Не мешало бы озвучить что такое c и b Улыбающийся

Не надо приводить, указатели всё равно одинаковые будут.
Строго говоря нет  Улыбающийся
Если база у них общая, то строго говоря да Улыбающийся
« Последнее редактирование: Май 16, 2012, 18:17 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
V1KT0P
Гость
« Ответ #13 : Май 16, 2012, 18:22 »

Если база у них общая, то строго говоря да Улыбающийся
Во во, а если множественное наследование, то баз уже как минимум =).
В данном случае не вижу зачем штудировать стандарт - в отладчике все прекрасно видно
Просто интересно узнать в каком видео оно там находится.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Май 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 разные)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.298 секунд. Запросов: 22.