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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Платформенно-зависимый код.  (Прочитано 9234 раз)
silart
Гость
« : Сентябрь 22, 2008, 11:39 »

Добрый день всем!

Возникла следующая проблема:
Функция QWidget::find() почему-то всегда возвращает нулевой указатель. Я ей передаю правильный HWND, но возвращаемое значение всегда ноль. Единственный раз удалось мне у нее получить указатель на виджет. Я сделал следующее: В конструкторе класса-виджета с помощью API функции FindWindow() получил HWND этого окна, и передал его QWidget::find(). Она вернула указатель такой же, что и this.
Может каким-то другим образом можно получить указатель QWidget через HWND?
Записан
ритт
Гость
« Ответ #1 : Сентябрь 22, 2008, 12:23 »

а можно код?
Записан
Alex03
Гость
« Ответ #2 : Сентябрь 22, 2008, 12:42 »

silart

FindWindow() - зачем? есть же WId QWidget::winId () const

А подсовываешь HWND окна этого же приложения?
Записан
silart
Гость
« Ответ #3 : Сентябрь 22, 2008, 18:29 »

а можно код?

Мне нужно получить QWidget из HWND.

Код:
HWND h;
pI->GetHWND(&h); // получаем валидный HWND какого-нибудь окна
QWidget* pMainWnd = QWidget::find(h); // Почему-то всегда получаем нулевой указатель.

Хотя если извратиться, получить каким-то образом HWND моего же Qt-шного окна (я это делал с помощью виндовой функции FindWindow()), и потом передать этот HWND функции QWidget::find(), то она возвратит валидный указатель, идентичный this (если мы все это делаем внутри оконного класса). Я все это проделал чтобы проверить работоспособность QWidget::find.
Так вот, каким образом можно получить QWidget из HWND?
Записан
SASA
Гость
« Ответ #4 : Сентябрь 22, 2008, 18:44 »

Assistant
Цитировать
QWidget * QWidget::find ( WId id )   [static]

Returns a pointer to the widget with window identifer/handle id.

The window identifier type depends on the underlying window system, see qwindowdefs.h for the actual definition. If there is no widget with this identifier, 0 is returned.

По-моему работает только с кутэшными окнами.
« Последнее редактирование: Сентябрь 22, 2008, 18:50 от SASA » Записан
ритт
Гость
« Ответ #5 : Сентябрь 22, 2008, 19:37 »

только с кутэшными окнами

в виджетпривате создаётся карта всех виджетов [вид => указатель]
Записан
silart
Гость
« Ответ #6 : Сентябрь 23, 2008, 04:48 »

только с кутэшными окнами

в виджетпривате создаётся карта всех виджетов [вид => указатель]

Ну а как же тогда мне сделать модальное окно на Qt, если известен родительский HWND?
Почему нельзя обернуть любой HWND в QObject?
Записан
Alex03
Гость
« Ответ #7 : Сентябрь 23, 2008, 06:35 »

Почему нельзя обернуть любой HWND в QObject?
Потому что find() только возвращает указатель на QWiidget() этого же приложения, ничего при этом не создавая. Другие приложения не обязательно написаны на Qt, и соответственно у них может не быть QWiidget-объекта, да и доступ к объектам др. приложения Вам никто не даст.

Вы опишите задачу в целом, а не то как Вы её пытаетесь решить.
Записан
silart
Гость
« Ответ #8 : Сентябрь 23, 2008, 07:04 »

Вы опишите задачу в целом, а не то как Вы её пытаетесь решить.

Я делаю внешнюю компоненту для программы 1С. Это внутрипроцессный COM-сервер. Внутрь передается указатель на COM-объекты самого 1С из которого можно выдрать HWND его окна. А мне нужно окно сделать на QT и сделать окно модальным, то есть пока окно будет видимым, 1С не должен быть доступен. Вот я и хочу обернуть HWND в QWidget. Окно уже создается. С помощью SetParent() я присвоил ему родителя - окно 1С. (кстати функция QWidget::winId() работает нормально). Одна проблема щас - сделать наше окно модальным. Вы не подскажете, может виндовыми функциями это можно сделать?
Записан
Tonal
Гость
« Ответ #9 : Сентябрь 23, 2008, 07:45 »

В Qt Solutions есть qtwinmigrate как раз для нормального взаимодействия с окнами написанными на чём попало не на Qt. Улыбающийся

Но твоя задача проще. Можно обойтись и без qtwinmigrate.
Тебе нужно наследовать своё окно от QDialog,
и при вызове функции показа окна:
1) Создать экземпляр QApplication
2) Создать окно
3) Сделать ему exec.
Примерно так:
Код:
int invoceMyQtWindow(params...) {
  QApplication app;
  QMyWindow win(params...);
  return win.exec();
}
« Последнее редактирование: Сентябрь 23, 2008, 07:50 от Tonal » Записан
kirill
Гость
« Ответ #10 : Сентябрь 23, 2008, 07:49 »

Кури в сторону QWinWidget из пакета QtWinMigrate.
Код:
                     //HWND hParentWnd
QWinWidget *m_winparent = new QWinWidget(hParentWnd);
QVBoxLayout *vl = new QVBoxLayout;
vl->addWidget(new QlineEdit());
m_winparent->setLayout(vl);
m_winparent->setGeometry(m_parent->geometry());
m_winparent->show();
Записан
silart
Гость
« Ответ #11 : Сентябрь 23, 2008, 09:02 »

В Qt Solutions есть qtwinmigrate как раз для нормального взаимодействия с окнами написанными на чём попало не на Qt. Улыбающийся

Но твоя задача проще. Можно обойтись и без qtwinmigrate.
Тебе нужно наследовать своё окно от QDialog,
и при вызове функции показа окна:
1) Создать экземпляр QApplication
2) Создать окно
3) Сделать ему exec.
Примерно так:
Код:
int invoceMyQtWindow(params...) {
  QApplication app;
  QMyWindow win(params...);
  return win.exec();
}

Я и делаю примерно так. Кстати, QApplication насколько мне известно не имеет параметров по умолчанию.
Только дело в том, что мое окно создается в другом потоке (не в том, который обрабатывает главное окно 1С) и получается так, что на панеле задач 2 окна: мое и 1С. Но я пошел дальше, с помощью функции SetParent() я задал родителя моему окну. Окна также остались активными, но теперь на панеле задач одно окно 1С. Да, вот еще, я имею HWND не главного окна 1С, а какого-то его предка, рабочая область короче. Вот мне и надо сделать так, чтобы рабочая область бла неактивна во время работы с моим окном. EnableWindow() почему-то делает оба окна неактивными.
Записан
silart
Гость
« Ответ #12 : Сентябрь 23, 2008, 09:04 »

Кури в сторону QWinWidget из пакета QtWinMigrate.
Код:
                     //HWND hParentWnd
QWinWidget *m_winparent = new QWinWidget(hParentWnd);
QVBoxLayout *vl = new QVBoxLayout;
vl->addWidget(new QlineEdit());
m_winparent->setLayout(vl);
m_winparent->setGeometry(m_parent->geometry());
m_winparent->show();

Подскажите пожалуйста, где взять этот пакет? У меня Qt 4.4.0, там вроде такого нету...
Записан
silart
Гость
« Ответ #13 : Сентябрь 23, 2008, 10:02 »

Товарищи, где можно взять Qt/MFC Migration Framework? С официального сайта не дают скачать. В гугле рылся, тоже пока не нашел. Кирилл, если у вас есть, может поделитесь?
Записан
kirill
Гость
« Ответ #14 : Сентябрь 23, 2008, 11:00 »

Сорри, у меня комерциал, не могу.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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