Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Декабрь 11, 2012, 16:39



Название: Использование приватных функций Qt
Отправлено: ecspertiza от Декабрь 11, 2012, 16:39
Кто скажет как можно заюзать приватные функции Qt?

в частности интересует qt_mac_get_scalefactor()

она находится в файле qt_cocoa_helpers_mac_p.h, но внутри есть инклуды типа <private/blablabla> и при компиляции компилятор ругается на private.


Название: Re: Использование приватных функций Qt
Отправлено: Alex Custov от Декабрь 11, 2012, 16:51
и при компиляции компилятор ругается на private.

Как именно? Неужели так сложно сразу запостить ошибку?


Название: Re: Использование приватных функций Qt
Отправлено: Bepec от Декабрь 11, 2012, 16:53
Насколько я помню, у тебя это получится только с выдёргиванием всего включенного функционала.
И в ассистенте написано, что если функции объявлены приватными, они не рекомендуются для использования. Слишком масштабные бедствия можно вызвать :)


Название: Re: Использование приватных функций Qt
Отправлено: ecspertiza от Декабрь 11, 2012, 16:58
и при компиляции компилятор ругается на private.

Как именно? Неужели так сложно сразу запостить ошибку?

моя вина, подумал что это очевидно, ругается так

Код:
error: private/qt_mac_p.h: No such file or directory
error: private/qeffects_p.h: No such file or directory
private/qwidget_p.h: No such file or directory

Насколько я помню, у тебя это получится только с выдёргиванием всего включенного функционала.
И в ассистенте написано, что если функции объявлены приватными, они не рекомендуются для использования. Слишком масштабные бедствия можно вызвать :)

понимаю что это плохо, но мне либо тот же функционал переписать либо просто подключить готовый :) тем более нужна одна ф-ция


Название: Re: Использование приватных функций Qt
Отправлено: Alex Custov от Декабрь 11, 2012, 17:03
Код:
error: private/qt_mac_p.h: No such file or directory
error: private/qeffects_p.h: No such file or directory
private/qwidget_p.h: No such file or directory

Скорее всего не прописаны пути для поиска инклудов. Покажи строку компиляции конкретного файла.


Название: Re: Использование приватных функций Qt
Отправлено: ecspertiza от Декабрь 11, 2012, 17:16
Код:
g++-4.0 -c -pipe -O2 -arch i386 -Wall -W -isysroot /Developer/SDKs/MacOSX10.6.sdk -DQT_NO_DEBUG -DQT_DECLARATIVE_LIB -DQT_WEBKIT_LIB -DQT_SQL_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.4/mkspecs/macx-g++40 -I. -I/usr/local/Trolltech/Qt-4.8.4/lib/QtCore.framework/Headers -I/usr/local/Trolltech/Qt-4.8.4/include/QtCore -I/usr/local/Trolltech/Qt-4.8.4/lib/QtNetwork.framework/Headers -I/usr/local/Trolltech/Qt-4.8.4/include/QtNetwork -I/usr/local/Trolltech/Qt-4.8.4/lib/QtGui.framework/Headers -I/usr/local/Trolltech/Qt-4.8.4/include/QtGui -I/usr/local/Trolltech/Qt-4.8.4/lib/QtXml.framework/Headers -I/usr/local/Trolltech/Qt-4.8.4/include/QtXml -I/usr/local/Trolltech/Qt-4.8.4/lib/QtSql.framework/Headers -I/usr/local/Trolltech/Qt-4.8.4/include/QtSql -I/usr/local/Trolltech/Qt-4.8.4/lib/QtWebKit.framework/Headers -I/usr/local/Trolltech/Qt-4.8.4/include/QtWebKit -I/usr/local/Trolltech/Qt-4.8.4/lib/QtDeclarative.framework/Headers -I/usr/local/Trolltech/Qt-4.8.4/include/QtDeclarative -I/usr/local/Trolltech/Qt-4.8.4/include -I/usr/local/Trolltech/Qt-4.8.4//src/3rdparty/zlib -I/usr/local/Trolltech/Qt-4.8.4//src/gui/text -I/Users/macmini/Downloads/qt-everywhere-opensource-src-4.8.4/include/QtGui/private -I../../quazip-0.5/quazip -Itmp/moc_dir -Itmp/ui/include -F/usr/local/Trolltech/Qt-4.8.4//lib -o tmp/obj/surfacewindow.o src/surfacewindow.cpp
In file included from /Users/macmini/Downloads/qt-everywhere-opensource-src-4.8.4/include/QtGui/private/qt_cocoa_helpers_mac_p.h:1,
                 from src/surfacewindow.cpp:16:
/Users/macmini/Downloads/qt-everywhere-opensource-src-4.8.4/include/QtGui/private/../../../src/gui/kernel/qt_cocoa_helpers_mac_p.h:91:30: error: private/qt_mac_p.h: No such file or directory
/Users/macmini/Downloads/qt-everywhere-opensource-src-4.8.4/include/QtGui/private/../../../src/gui/kernel/qt_cocoa_helpers_mac_p.h:105:32: error: private/qeffects_p.h: No such file or directory
/Users/macmini/Downloads/qt-everywhere-opensource-src-4.8.4/include/QtGui/private/../../../src/gui/kernel/qt_cocoa_helpers_mac_p.h:106:31: error: private/qwidget_p.h: No such file or directory


Название: Re: Использование приватных функций Qt
Отправлено: ecspertiza от Декабрь 11, 2012, 17:48
можно закрывать тему :) выдернул эту ф-цию целиком, а она всеравно не верно работает.


Название: Re: Использование приватных функций Qt
Отправлено: kambala от Декабрь 11, 2012, 18:18
функция состоит аж из одной строки :) ты же под карбон собираешь? может дело в том, что она Deprecated в 10.7?

p.s. а нельзя её вызвать как-нибудь по-хитрому, аналогично функции установки меню для иконки приложения?
Код
C++ (Qt)
CGFloat qt_mac_get_scalefactor(); // объявили
CGFloat scaleFactor = qt_mac_get_scalefactor();


Название: Re: Использование приватных функций Qt
Отправлено: V1KT0P от Декабрь 11, 2012, 21:34
моя вина, подумал что это очевидно, ругается так

Код:
error: private/qt_mac_p.h: No such file or directory
error: private/qeffects_p.h: No such file or directory
private/qwidget_p.h: No such file or directory
Дык все что оканчивается на "*_p" является приватным и поэтому не поставляются с бинарными сборками. Скачай полные исходники и они там будут.


Название: Re: Использование приватных функций Qt
Отправлено: ecspertiza от Декабрь 12, 2012, 12:47
p.s. а нельзя её вызвать как-нибудь по-хитрому, аналогично функции установки меню для иконки приложения?

тоже пробовал так, но тогда не линкуется софт, просит описание ф-ции.

моя вина, подумал что это очевидно, ругается так

Код:
error: private/qt_mac_p.h: No such file or directory
error: private/qeffects_p.h: No such file or directory
private/qwidget_p.h: No such file or directory
Дык все что оканчивается на "*_p" является приватным и поэтому не поставляются с бинарными сборками. Скачай полные исходники и они там будут.

у меня полные исходники есть, но я думаю что проблема именно с private в начале пути, ибо я такого пути не нашел даже :)


Так или иначе проблему решил. Функция которую использует Qt работает либо не корректно, либо я не совсем понимаю ее назначения, она всегда возвращает 1, даже на retina дисплеях. Собственно говоря, я просто впилил *.mm файл в проект и немного переписал ф-цию

Код:
CGFloat qt_mac_get_scalefactor()
{
    return [[NSScreen mainScreen] backingScaleFactor];
}

для обычных дисплеев я получаю 1 ,а для ретина 2. Может это комуто поможет :) А и да, нужно добавить путь к OSX 10.7 SDK иначе не соберется проект.


Название: Re: Использование приватных функций Qt
Отправлено: kambala от Декабрь 12, 2012, 13:36
ты ведь таким образом отсекаешь всех «дольвиных» пользователей. может имеет смысл написать так?
Код
Objective-C
CGFloat qt_mac_get_scalefactor()
{
   NSScreen *screen = [NSScreen mainScreen];
   return [screen respondsToSelector:@selector(backingScaleFactor)] ? [screen backingScaleFactor] : [screen userSpaceScaleFactor];
}


Название: Re: Использование приватных функций Qt
Отправлено: ecspertiza от Декабрь 12, 2012, 13:40
хм, спасибо за совет, в мак апи еще совсем не силен :)