主题 : QPaintDevice: Must construct a QApplication before a QPaintDevice 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 103622
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2014-04-30
最后登录: 2014-11-05
楼主  发表于: 2014-08-25 18:41

 QPaintDevice: Must construct a QApplication before a QPaintDevice

编译移植ffmpeg-2.3.2, SDL-1.2.15, qtopia-2.2.0到4412开发板,好不容易都编译通过了,运行时报错:QPaintDevice: Must construct a QApplication before a QPaintDevice,网上帖子说是qwt.pro的release/debug问题,可是FriendlyARM提供qtopia-2.2.0里并没有什么qwt,或者网贴说的PC上VS编译环境的。本人Qt不懂,有没有高手遇到这个问题,请赐教!谢谢
级别: 新手上路
UID: 103622
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2014-04-30
最后登录: 2014-11-05
1楼  发表于: 2014-08-26 15:57
问题貌似出在SDL,

    SDL_Init()
    \|/
    SDL_InitSubSystem()
    \|/
    SDL_VideoInit()
    \|/
    (1) video = bootstrap->create(index);

        static VideoBootStrap *bootstrap[] = {
            ...
        #if SDL_VIDEO_DRIVER_QTOPIA
            &Qtopia_bootstrap,
        #endif
            ...
        };

        VideoBootStrap Qtopia_bootstrap = {
            "qtopia", "Qtopia / QPE graphics",
            QT_Available, QT_CreateDevice
        };
        \|/
        QT_CreateDevice()
        {
            device->VideoInit = QT_VideoInit;
        }

    (2) if ( video->VideoInit(video, &vformat) < 0 ) {
        \|/
        QT_VideoInit()
        {
            ((QPEApplication*)qApp)->showMainWidget(SDL_Win);
        }
qApp找不到在哪里创建new?貌似应该在SDL_InitQPEApp(),可是,SDL_InitQPEApp()没有被调用
级别: 新手上路
UID: 103622
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2014-04-30
最后登录: 2014-11-05
2楼  发表于: 2014-09-05 14:14
[root@fc9 SDL-1.2.15]# vim src/video/qtopia/SDL_sysvideo.cc
+    #include "SDL_QPEApp.h"            注意:不要放在extern "C"{} 里,否则链接时会报错SDL_InitQPEApp()找不到相应的二进制码

extern "C" {
    ...
}

int QT_VideoInit(_THIS, SDL_PixelFormat *vformat)
{
+    SDL_InitQPEApp();
    QSize desktop_size = qApp->desktop()->size();

void QT_VideoQuit(_THIS)
{
    QT_GrabInput(_this, SDL_GRAB_OFF);
+    SDL_QuitQPEApp();

[root@fc9 SDL-1.2.15]# vim src/video/qtopia/SDL_QPEApp.cc
-    char *argv[] = { { "SDLApp" } };
+    char *argv[] = { (char *){ "SDLApp" } };
    app = new QPEApplication(argc, argv);
+    qApp = app;

[root@fc9 SDL-1.2.15]# vim src/video/qtopia/SDL_QWin.cc
-    my_painter->end();
+    //my_painter->end();
    delete my_painter;