QWidget Must construct a QApplication before a QPaintDevice!!!很急!!

ff007bit 2012-02-17 08:08:54
我使用VS10+QT4.7.4
(QT库是我用VS10静态编译的)
现在我新建一个Qt Library工程生成一个DLL,DLL里面是一个继承自QWidget的类A
之后我在另一个exe工程中静态调用该DLL

但是每次都出现QWidget: Must construct a QApplication before a QPaintDevice!

如果哪位有和我一样环境的麻烦帮我试一下,我搞了一天还是不对.项目很急.
哪位大神帮忙解答一下

注:我把静态库换成同样自己用VS10编译的动态库,就不会出现问题.
但是我必须是用静态库,项目不能带着DLL走.

万分感谢!
...全文
1169 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ff007bit 2012-02-22
  • 打赏
  • 举报
回复
那发布的程序都带着QT的DLL库?
zhu_xz 2012-02-21
  • 打赏
  • 举报
回复
可能和你的链接方式有关系吧,从来没尝试过静态链接Qt库...
ff007bit 2012-02-21
  • 打赏
  • 举报
回复
这是main.cpp的

#include "ff.h"
#include <QtGui/QApplication>

#include "../FFDLL/ffdll.h"
#pragma comment(lib, "../Test/FFDLL.lib")

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FF w;
w.show();
//动态库中的UI类
FFDLL dll;
dll.show();
return a.exec();
}

这是MainWindow的类(我的exe是QT MainWindow)

//ff.h
#ifndef FF_H
#define FF_H

#include <QtGui/QMainWindow>
#include "ui_ff.h"

class FF : public QMainWindow
{
Q_OBJECT

public:
FF(QWidget *parent = 0, Qt::WFlags flags = 0);
~FF();

private:
Ui::FFClass ui;
};

#endif // FF_H


//ff.cpp
#include "ff.h"

FF::FF(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
}

FF::~FF()
{
}


下面是DLL,和创建这个项目的时候一样.
我唯一的改动的就是让FFDLL继承了QWidget

//ffdll_global.h
#ifndef FFDLL_GLOBAL_H
#define FFDLL_GLOBAL_H

#include <QtCore/qglobal.h>

#ifdef FFDLL_LIB
# define FFDLL_EXPORT Q_DECL_EXPORT
#else
# define FFDLL_EXPORT Q_DECL_IMPORT
#endif

#endif // FFDLL_GLOBAL_H


//ffdll.h
#ifndef FFDLL_H
#define FFDLL_H

#include <QtGui/QWidget>
#include "ffdll_global.h"

class FFDLL_EXPORT FFDLL:public QWidget
{
public:
FFDLL();
~FFDLL();

private:

};

#endif // FFDLL_H


//ffdll.cpp
#include "ffdll.h"

FFDLL::FFDLL()
{
}

FFDLL::~FFDLL()
{

}


真的很感谢您!
ff007bit 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 zhu_xz 的回复:]

就是说你要静态链接Qt库,但是动态链接一个自己的库?
[/Quote]
我想静态链接QT库,用QT库的lib,
同时动态链接自己编写的QT 的UI DLL库
zhu_xz 2012-02-21
  • 打赏
  • 举报
回复
就是说你要静态链接Qt库,但是动态链接一个自己的库?
ff007bit 2012-02-21
  • 打赏
  • 举报
回复
我加了还是出现问题...
ff007bit 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zhu_xz 的回复:]

你的代码在Linux上没问题啊
在FFDLL的构造函数上加上对基类QWidget构造函数的调用看看呢,不记得这个是不是必须的了
[/Quote]
我在VS上用,如果用静态编译就失败,用动态编译就可以成功.
但是动态编译,最后要带着Qt的DLL
zhu_xz 2012-02-21
  • 打赏
  • 举报
回复
你的代码在Linux上没问题啊
在FFDLL的构造函数上加上对基类QWidget构造函数的调用看看呢,不记得这个是不是必须的了
zhu_xz 2012-02-20
  • 打赏
  • 举报
回复
你还是贴一下代码吧,我不能重现你的问题
ff007bit 2012-02-20
  • 打赏
  • 举报
回复
我的DLL就是新创建的Qt Library项目,只是把类继承了QWidget,其他的什么都没加.
主程序,就是引用了.h和.lib,然后在main函数中调用了一下
其他的什么都没有
zhu_xz 2012-02-20
  • 打赏
  • 举报
回复
不要使用全局变量,因为其构造的时间不确定。
最好你能够提供一个最简单的代码来重现你的问题,可以尝试把你的库里面所有无关的代码都注释掉先,然后就能发现问题了。
ff007bit 2012-02-20
  • 打赏
  • 举报
回复

#include "ff.h"
#include <QtGui/QApplication>
#include "../FFDLL/ffdll.h"
#pragma comment(lib, "../Test/FFDLL.lib")

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FF w;
w.show();
//DLL中界面
FFDLL dll;
dll.show();
return a.exec();
}

我以前的main函数是这样的
尝试了静态的QApplication还是不行
尝试把QApplication编程全局变量总是报错.
int ab = 1;
char *ac[1];
QApplication a(ab,ac);
zhu_xz 2012-02-20
  • 打赏
  • 举报
回复
我的意思是,你有没有创建全局的QWidget对象?
因为这个错误是在QWidget的构造函数里面的,所以如果你没有构建QWidget对象,就不会遇到这个错误。
ff007bit 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhu_xz 的回复:]

我的意思是,你有没有创建全局的QWidget对象?
因为这个错误是在QWidget的构造函数里面的,所以如果你没有构建QWidget对象,就不会遇到这个错误。
[/Quote]
恩~说的比较有道理,没有全局的,就是在main函数中创建的QApplication对象
我试试
zzzqiuchan 2012-02-19
  • 打赏
  • 举报
回复
可以尝试Qt Plugin
ff007bit 2012-02-18
  • 打赏
  • 举报
回复
自己顶!!
ff007bit 2012-02-18
  • 打赏
  • 举报
回复
static?
没有,我就是QT Library生成的DLL项目,然后继承了QWidget
没设置什么static
ff007bit 2012-02-18
  • 打赏
  • 举报
回复
静态的QWidget是什么意思?
我用的QT库是用VS静态编译的,这算是吗?
zhu_xz 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ff007bit 的回复:]

引用 1 楼 zhu_xz 的回复:

你有没有创建QApplication对象?

我在exe程序中的main函数里创建了,就是代码第一行
就是在VS下生成Qt Application默认的那样
[/Quote]
你的错误提示“QWidget: Must construct a QApplication before a QPaintDevice!”就是说有QWidget对象在QApplication对象被创建前就已经创建了。

那是不是你有静态的QWidget对象?
ff007bit 2012-02-18
  • 打赏
  • 举报
回复
你给我的例子是不是MFC中调用QT界面的?
我是QT的Application 调用QT界面
加载更多回复(6)

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧