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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: NSWindow -> QWidget  (Прочитано 9422 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 30, 2014, 10:18 »

Добрый день

Как найти QWidget имея NSWindow?  QWidget::find(WId) принимает NSView - но это не NSWindow

Спасибо
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Декабрь 30, 2014, 10:31 »

А разве Кьют свои виджеты сам не отрисовывает под макосью? Под виндой, допустим, вся отрисовка идет внутри и винда ни о каких элементах не знает.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 30, 2014, 10:45 »

А разве Кьют свои виджеты сам не отрисовывает под макосью?
Мне надо пробежаться по top-level окнам в Z-order, а в Qt этого так и нет (буду рад ошибиться). Пришлось нырять в нативняк, там можно получить массив NSWindow * (типа HWND) - а дальше?

Под виндой, допустим, вся отрисовка идет внутри и винда ни о каких элементах не знает.
В пятерке это уже не так. Контролы могут иметь HWND.  напр если позвать winId() или использовать OpenGL. Когда/зачем они создаются - не вникал, но точно есть - Spy их видит
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Декабрь 30, 2014, 11:39 »

Под виндой, допустим, вся отрисовка идет внутри и винда ни о каких элементах не знает.
В пятерке это уже не так. Контролы могут иметь HWND.  напр если позвать winId() или использовать OpenGL. Когда/зачем они создаются - не вникал, но точно есть - Spy их видит
[/quote]
Так было всегда, не только в пятерке.
Записан

Гугль в помощь
RSATom
Гость
« Ответ #4 : Декабрь 30, 2014, 11:49 »

Если Qt не создал HWND для виджета по некоторым своим внутренним причинам (например Widget является окном верхнего уровня) - то HWND принудительно создается как раз при вызове winId()

upd1: но это само собой касается Windows, Mac OS X так глубоко пока еще не ковырял. Но думаю там ситуация та же.
« Последнее редактирование: Декабрь 30, 2014, 11:52 от RSATom » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Декабрь 30, 2014, 12:19 »

NSWindow — наследник NSView
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 30, 2014, 12:40 »

Так было всегда, не только в пятерке.
Довольно громогласное заявление Улыбающийся На OSX подтверждаю - и в четверке каждый контрол имел нативное представление (хотя рисовался средствами Qt). На Вындоуз я долго верил в легенду "HWND только для top окон". Впрочем это уже неважно.

NSWindow — наследник NSView
И что, как выцарапать из него QWidget? Придумал так: пробегаю по topLevelWindows, по каждому беру winId() и от нее NSWindow [view window]. Потом ищу это в массиве полученном через NSWondowList. Как-то коряво, но др мыслей нет, буду делать пример
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Декабрь 30, 2014, 13:04 »

NSWindow — наследник NSView
И что, как выцарапать из него QWidget? Придумал так: пробегаю по topLevelWindows, по каждому беру winId() и от нее NSWindow [view window]. Потом ищу это в массиве полученном через NSWondowList. Как-то коряво, но др мыслей нет, буду делать пример
а, так QWidget::find(window) не прокатывало? как-то странно.

QWindowList QGuiApplication::​topLevelWindows()/allWindows() — не то? (qt 5)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Декабрь 30, 2014, 13:27 »

а, так QWidget::find(window) не прокатывало? как-то странно.
нет, наверное NSView идет агрегатом

QWindowList QGuiApplication::​topLevelWindows()/allWindows() — не то? (qt 5)
Он не сортируется (ни по Z, никак) - это давно больное место

Так работает
Код
C++ (Qt)
QVector <QWidget *> GetMacZOrderWinList( void )
{
QVector <QWidget *> dst;
NSInteger windowCount;
NSCountWindows(&windowCount);
if (windowCount <= 0) return dst;
 
QWidgetList lst = QApplication::topLevelWidgets();
QHash<NSWindow *, QWidget *> hash;
for (int i = 0; i < lst.size(); ++i) {
QWidget * widget = lst[i];
NSView * view = (NSView *) widget->winId();
if (!view) continue;
NSWindow * nsWin = [view window];
if (nsWin)
hash[nsWin] = widget;
}
 
QVector <NSInteger> src(windowCount);
NSWindowList(windowCount, &src[0]);
for (int i = 0; i < windowCount; ++i) {
        NSWindow * window = [NSApp windowWithWindowNumber:src[i]];
       if (!window) continue;
//       QWidget * w = QWidget::find((WId) window); // returns 0
QWidget * widget = hash.value(window);
if (widget) dst.push_back(widget);
}
 
return dst;
}
Но лучше бы без велосипедов (здесь Улыбающийся)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Декабрь 31, 2014, 17:14 »

я делал это так - ловил событие activate у окна и клал в начало списка окон, удаляя из середины/конца. делается кроссплатформенно
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 31, 2014, 18:15 »

я делал это так - ловил событие activate у окна и клал в начало списка окон, удаляя из середины/конца. делается кроссплатформенно
То надо "самому отслеживать" - и хз что с палетками, тулзами и "посторонними" окнами
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Декабрь 31, 2014, 21:10 »

Ну я делал для конкретного типа окон. Собственно, варианта 2 - либо нам нужны окна определенного типа, либо все "топлевел" (за исключением туловых, попапов, меню и прочего хлама). Хлам отсеивается при помощи флагов (Qt::WindowFlags).
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #12 : Январь 01, 2015, 14:34 »

Так было всегда, не только в пятерке.
Довольно громогласное заявление Улыбающийся
Ну да, это же была одна из ключевых фич четверки, что по умолчанию виджеты были не native и это было реализован под всеми платформами. В Qt1-3 виджеты имели под собой нативные окна.

Хотя да, "так было всегда" я погорячился )
Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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