编译或运行时出现的错误及解决

这里的很多错误都是很小的错误,有的甚至低级,但是当它发生的时候总是会搞得你一头雾水,花半天时间也不知道到底那里错了。L




所有代码都是在qt3.3.8+fedora8下运行的。


1. 编译时出错:构造函数××ד是私有的”
/usr/lib/qt-3.3/include/qwidget.h: In copy constructor ‘CDishTypePage::CDishTypePage(const CDishTypePage&)’:
/usr/lib/qt-3.3/include/qwidget.h:738: 错误:‘QWidget::QWidget(const QWidget&)’ 是私有的
cdishtypepage.h:10: 错误:在此上下文中
cmainformboard.cpp: In constructor ‘CMainFormBoard::CMainFormBoard(QWidget*, const char*)’:
cmainformboard.cpp:14: 附注:在这里第一次需要生成的方法 ‘CDishTypePage::CDishTypePage(const CDishTypePage&)’
cmainformboard.cpp:14: 错误: initializing temporary from result of ‘CDishTypePage::CDishTypePage(QWidget*, const char*)’
解决:
出现上面的错误是因为定义类对象的时候没有用指针:
CDishTypePage dishTypePage = new CDishTypePage(this, "dishTypePage");
应改成:
CDishTypePage *dishTypePage = new CDishTypePage(this, "dishTypePage");

2. 运行时出现下面的错误:
浮点数例外 多半是因为出现除0现象
段错误 多半是因为使用了空指针,如对象还未初始化就调用了它的成员函数
非法指令 原因应该很多,我遇到的目前只有一种情况:qDebug输出QString对象之前未转换,如下:
qDebug("typeid=%s", typeID);
应写成:
qDebug("typeid=%s", typeID.ascii());

3. 编译时出错:变量×××有初始值设定,但是类型不完全
ccommfunctions.cpp:17: 错误:变量 ‘QImage qimage’ 有初始值设定,但是类型不完全
ccommfunctions.cpp:17: 错误:invalid use of undefined type ‘struct QImage’
/usr/lib/qt-3.3/include/qwindowdefs.h:74: 错误:forward declaration of ‘struct QImage’
ccommfunctions.cpp:18: 错误:嵌套名指定中使用了不完全的类型 ‘QImage’
ccommfunctions.cpp: At global scope:
ccommfunctions.cpp:14: 警告:‘QPixmap getFretchPixmap(int, int, const char*)’ 定义后未使用
make: *** [ccommfunctions.o] 错误 1
解决:
把#include 加在.h文件里就好了

4. 在头文件里定义常量的错误:ISO C++ 不允许成员 ‘M_ICON_WIDTH’ 的初始化
一定要static和const一起使用,否则提示错误:
const int M_ICON_WIDTH = 100;
ddishpage.h:30: 错误:ISO C++ 不允许成员 ‘M_ICON_WIDTH’ 的初始化
ddishpage.h:30: 错误:使 ‘M_ICON_WIDTH’ 成为静态的
应该写成:
static const int M_ICON_WIDTH = 100;

5. 指针对象使用成员函数时的错误:
对成员‘setText’的请求出现在‘((DPasswordForm*)this)->DPasswordForm::m_editPassword’中,而后者具有非类类型‘QLineEdit*’
对成员‘text’的请求出现在‘((DPasswordForm*)this)->DP

asswordForm::m_editPassword’中,而后者具有非类类型‘QLineEdit*’
解决:
其实原因很简单:定义了QLineEdit的指针对象,而使用“.”来调用成员函数:
QLineEdit *le = new QLineEdit(this);
le.setText("");
改成:le->setText("");就好了

6. 找不到类的成员函数
/home/wj/cy2_dzcd/bpixmapbuttonbase.cpp:20: undefined reference to `CCommFunctions::getMonoPixmap(QPixmap)'
collect2: ld 返回 1
make: *** [cy2_dzcd] 错误 1
解决:
cpp文件里,看看是不是在定义的时候函数名前面忘记写类名了,
QPixmap getMonoPixmap(QPixmap pix)
改成:
QPixmap CCommFunctions::getMonoPixmap(QPixmap pix)

7. 设置背景色的错误
语句:
m_qivDishIconView->setPaletteBackgroundColor(new QColor(77, 00, 113));
错误:
ddishpage.cpp:38: 错误:从类型 ‘QColor*’ 到类型 ‘QRgb’ 的转换无效
ddishpage.cpp:38: 错误: 初始化实参 1,属于 ‘QColor::QColor(QRgb, uint)’
解决:
改成:m_qivDishIconView->setPaletteBackgroundColor(QColor(77, 00, 113));

8. 未引用头文件的错误
dmenupage.cpp:95: 错误:invalid use of undefined type ‘struct QObjectList’
/usr/lib/qt-3.3/include/qobjectdefs.h:161: 错误:forward declaration of ‘struct QObjectList’
解决:
在文件开头引入头文件:#include


如果是在头文件里缺少引入,则会提示:

page.h:25: 错误:ISO C++ 不允许声明无类型的 ‘QButtonGroup’

解决方法同上。


9. 每次修改、保存源文件之后,再make工程都会出现找不到类定义或是其它奇快问题
可能是有些外部新生成的类文件没有引到QT Designer里:如从cvs上新下载下来,或是编译器自动生成的。
这时,关闭工程,重新打开,就会解决问题。
所以,每次启动QT Designer之前,现在工程目录下cvs update + make一下是一个好的习惯。

10. widget显示的问题
一个Dialog窗口,只要定义一个widget对象就会在左上角出现一个类似label的区域,与底层同样式的时候不易看出来,给底层加个背景图就看出来了。
解答:实际上那是一个QWidget对象,在程序中会用到它的一些函数。若不希望它显示出来,可以用widget->setHidden(true);使它隐藏。

11.“重复定义”系统生成的类或是函数
qmake_image_collection.o: In function `qCleanupImages_dianke_dcq()':
/usr/lib/qt-3.3/include/qglist.h:150: multiple definition of `qCleanupImages_dianke_dcq()'
qmake_image_collection.o:/usr/lib/qt-3.3/include/qglist.h:150: first defined here
qmake_image_collection.o: In function `qInitImages_dianke_dcq()':
/home/wj/dianke_dcq/qmake_image_collection.cpp:14234: multiple definition of `qInitImages_dianke_dcq()'
qmake_image_collection.o:/home/wj/dianke_dcq/qmake_image_collection.cpp:14234: first defined here
解决:步骤如下:
(1) 关闭Qt Designer
(2) 清除所有生成文件,再重

新生成一次.pro文件
make clean
qmake -project
qmake
make
(3) 启动Qt Designer

12. QLayout父子关系的问题
这个错误只是在运行的时候发出提示,并不会对运行造成影响,但有错误提示总是不好的。
源码如下:
QGridLayout *grid = new QGridLayout(this, 2, 2, M_MARGIN);
QVBoxLayout *vBox = new QVBoxLayout(this);
grid->addLayout(vBox, 0, 1);
当两个QLayout对象的定义的父都指定this的时候,会出现如下错误提示:
QLayout "unnamed" added to BDishItem "0118", which already has a layout
将第二行改成:
QVBoxLayout *vBox = new QVBoxLayout(grid);
会出现如下错误提示:
QLayout::addChildLayout: layout already has a parent
再将第二行改成:
QVBoxLayout *vBox = new QVBoxLayout(0);
则错误提示消失。
所以,在这种情况下,先不指定父,再用语句定义的时候就不会出现错误提示了。

13. 构造函数是私有的
错误:‘DOrderDishesPage::DOrderDishesPage(QWidget*, const char*)’ 是私有的
解决:在未指定函数或变量的属性的时候,默认是私有的,所以在.h文件的构造函数声明前加上public:
public:
DOrderDishesPage(QWidget *parent, const char *name);

14. ‘QWidget’ 是 ‘DOrderDishesPage’ 不可访问的基类
类的声明如下:
class DOrderDishesPage : QWidget
{
Q_OBJECT
public:
DOrderDishesPage(QWidget *parent, const char *name);
……
};

错误:‘QWidget’ 是 ‘DOrderDishesPage’ 不可访问的基类
解决:在类声明的父类前加上public。
class DOrderDishesPage : public QWidget

15. [int]’ 用作数组下标类型无效
代码如下:
QPtrList l = g_managerdata->getAllListPrintContent();
CPrintContent *pc = l.at[0];
编译时会出现上面的错误:
[int]’ 用作数组下标类型无效
解决:
其实是一个很低级的错误:在at的后面应该用()而不是[],因为它是一个函数。问题很简单,但是当它发生的时候总是会搞得你一头雾水,花半天时间也不知道到底那里错了。


16. 非整数类型的静态数据成员的初始化错误
错误:类中对具有非整数类型 ‘const QString’ 的静态数据成员的初始化无效
说明:在头文件里对非整型和枚举型的成员变量定义时,若同时赋初值,就会有这样的错误。
解决:在头文件里声明,.cpp程序体里初始化。如:
class1.h:

private:
const static QString M_DISHSTATE_SLOW;

.cpp:

const QString DOrderDishesPage::M_DISHSTATE_SLOW = "2";
Class1::Class1()
{

}



相关文档
最新文档