[Qt-interest] QWidget: Must construct a QApplication before a QPaintDevice

Yifei Li yifli at mtu.edu
Tue Sep 6 17:53:04 CEST 2011


On Sep 6, 2011, at 11:34 AM, Yifei Li wrote:

> 
> 
> On Sep 6, 2011, at 11:19 AM, Samuel Rødal wrote:
> 
>> On 09/06/2011 04:48 PM, ext Yifei Li wrote:
>>> 
>>>>> 
>>>>> Hi all,
>>>>> 
>>>>> I got this error when running an application (once working with
>>>>> Qt-4.6.2 on
>>>>> Snow Leopard) after I switch to Qt-4.8.0 on Lion.
>>>>> 
>>>>> The error occurs when I construct a QWidget in a plugin loaded by the
>>>>> main
>>>>> application. My application works as follows:
>>>>> 
>>>>> void main(int argc, char* argv[])
>>>>> {
>>>>> QApplication app(argc, argv);
>>>>> 
>>>>> // in Core's constructor, plugins are loaded using QPluginLoader
>>>>> Core core;
>>>>> 
>>>>> return app.exec();
>>>>> }
>>>>> 
>>>>> Any idea how to solve this? Thanks
>>>> 
> You mean static initialized data before plugins are loaded? I don't think so.  Here is what Core's constructor looks like:


Well, I may be wrong (but the same code ran perfectly on Snow Leopard with Qt-4.6.2)

My main actually looks like:
void main(int argc, char* argv[])
{
    QApplication app(argc, argv);

   // plugins are loaded in Core's constructor
   Core core;

   MyNameSpace::someFunction();

   return app.exec();
}

In MyNameSpace, I declared a static pointer:
namespace MyNameSpace {
    static GLViewer* viewer;    // GLViewer inherits from QGraphicsWidget
} 

>>>> You can do something along the lines of:
>>>> 
>>>> {
>>>> QApplication app(argc, argv);
>>>> // plugins are loaded in Core::load()
>>>> Core core;
>>>> QTimer::singleShot(0, &core, SLOT(load());
>>>> return app.exec();
>>>> }
>>>> 
>>> I tried your suggestion, but the problem persists: *QWidget: Must
>>> construct a QApplication before a QPaintDevice*
>>> 
>>> I don't understand, there's already a QApplication object 'app' before I
>>> load the plugins. How come Qt still complains?
>>> 
>>> To provide more information: my QMainWidget is constructed in Core's
>>> constructor
>>> 
>>> Any other ideas? Thanks
>>> 
>>> Yifiei
>> 
>> Are you sure your application doesn't contain static initialized data 
>> that uses QWidget?
>> 
>> --
>> Samuel
> 
> You mean static initialized data before plugins are loaded? I don't think so.  Here is what Core's constructor looks like:
> 
> Core::Core()
> {
>     // LogType is an enum
>     qRegisterMetaType<LogType>();
> 
>    // my QMainWindow widget
>    m_mainWindow = new MainWindowWidget();
> 
>    // load an image to be used as texture in my application
>   QDir textureDir();
>   Texture tex;    // Class Texture is defined by myself, it does not inherit from QObject
>   tex.loadImage(texturerDir.absoluteFilePath("..."));
> 
>   // LOAD PLUGINS HERE
>  …..
> 
> m_mainWindow->show();
> }
> 
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at qt.nokia.com
> http://lists.qt.nokia.com/mailman/listinfo/qt-interest




More information about the Qt-interest-old mailing list