类定义后面要加";" 函数的实现部分,如果定义部分有void,则实现部分不能少; 检查include文件有无少; error: request for member `show' in `((MainWindow*)this)->MainWindow::rightform', which is of non-class type `RightForm*'| "->"与"."问题 函数"()"千万不能少; connect中的SLOT里的自定义过程的申明一定要写在private slots:(或public slots:)下 QTableWidgetItem *newItemName = new QTableWidgetItem(tr("姓名")); newItemName->setFlags(newItemName->flags() & (~Qt::ItemIsEditable));//网格设置为只读 tblWidgetMingPian->setItem(0, 0, newItemName); newItemName = new QTableWidgetItem(tr("陈林 & (~Qt::ItemIsEditable)); tblWidgetMingPian->setItem(0, 1, newItemName); tblWidgetMingPian->verticalHeader()->hide(); tblWidgetMingPian->horizontalHeader()->hide(); tblWidgetMingPian->setRowHeight(0,25); tblWidgetMingPian->setRowHeight(1,25); tblWidgetMingPian->setRowCount(2);connsql.h tblWidgetMingPian->setColumnWidth(0,60); tblWidgetMingPian->setColumnWidth(1,100); if 里面的语句要加括号 if (条件) 枚举类型的定义: typedef enum{ nil, ready, fired, exceptional }Status; QString text = tr("%1 %2").arg(i + 1).arg(files[i]); Error:ISO C++ forbids declaration of `NavItem' with no type 如果出现以上的错误,其中NavItem是自定义类,则需检查有没Include 进此类的定义头文件, 并检查头文件的#ifndef中的名称跟其他类有没重复(在复制其它类生成新类时经常会出现这样的错误) ===================================================================================== /mingw/lib/libmingw32.a(main.o):main.c:(.text+0x104)||undefined reference to `WinMain@16'| 往 pro文件按顺序加入下面三行: -lmingw32 / -lSDLmain / -lSDL / sdl库中文件(sdl.h)里将 #include "SDLMain.h" 注释掉,否则qDebug(),printf全部无法显示 有可能使用 #pragma message()造成,方法:不使用#pragma message() 另:请检查 pro文件里有没INCLUDE入 main.cpp ======================================================================== cannot open output file debug/umpcphonegui.exe: Permission denied 产生此问题是由于文件umpcphonegui.exe受到保护,写不进去,打开任务管理器结束掉此进程就好了 ======================================================== pages.h|16|error: expected class-name before '{' token| ||=== Build finished: 1 errors, 0 warnings ===| 处理方法:没有include进所需的类 链接时提示""undefind reference to 'vtable for xxx'错误的处理方法: 重新makefile试下或 工程文件(.pro)中的HEADERS中没有加入定义该类的.h文件;另一原因,虚函数(或调用的虚函数)定义后没有加"=0"; int x,y; setupUi(this); this->move(10,60); this->resize(338,568); x = this->x() + this->frameGeometry().width(); y = this->y() + 20 ; //showMaximized(); rightform = new RightForm; rightform->move(x,y); ERROR:undefined reference to `RightGpsForm::RightGpsForm(QWidget*) 工程文件(*.pro)文件中的Source没有加入 RightGpsForm类实现的.cpp文件 头部定义有误,需检查头部名称跟文件名是否一样; 尝试重编译 error: ISO C++ forbids declaration of `GPSMainWindow' with no type| 类的定义GPSMainWindow(gpsmainwindow.h)中的 #ifndef MAINWINDOW_H_INCLUDED #define MAINWINDOW_H_INCLUDED 头部定义有误,需检查头部名称跟文件名是否一样; #include 时,提示下面的错误: QList: No such file or directory 解决方法: Project-build options-选择整个工程(左侧第一项)--切到右边的页"Search directories" 增加"$(#qt4.include)/QtGui/QtCore" QT中的目录用"/"表示 应用程序目录:QCoreApplication::applicationDirPath().append(tr("/world.png")); ========================= QSS: 设置TabWidget中的Tab页高度 QTabBar::tab { height: 14ex; width: 14ex; } ====================== TRACE_SUBSYSF(MYRUNLEVEL,MYMODULENAME,QString(QObject::tr(" 测试数据"))<<10); TRACE_LEVEL=5 TRACE_SUBSYS=MAIN /d/study/umpcapp/umpcapp-dev-1.0.0/gpsapp/deb ug/gpsapp.exe TRACE_SUBSYSF(5,"GUIAPP",QString(QObject::tr("构造函数创建完毕"))<<10); TRACE_SUBSYSF(5,"GUIAPP",tr("构造函数创建完毕")<<10); int ret = QMessageBox::question (this, tr("提示"), tr("确定要删除文件吗?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); 引用Dll文件(动态链接"qextserialport.dll")时,需在pro里加下面的语句, -l+dll文件名 LIBS += -lqextserialport // // listWidget->addItem("a"); // listWidget->addItem("b"); // QVariant var; // var.setValue (new int(789098)); // // listWidget->item(0)->setData(Qt::UserRole,var); // // int* ptr = listWidget->item(0)->data(Qt::UserRole).value < int* >(); // qDebug()<< "RecentNoteListForm::RecentNoteListForm:" << *ptr << endl; // delete ptr; // delete &listWidget->item(0)->data(Qt::UserRole); 删ITEM方法: 把把ITEM的数据挂到指针上,先删ITEM,然后再删除指针 如果发生 no such file or directory not find(报QT核心文件错) 有可能是project --properties--projects settings中的"This is a custom MakeFile"没有勾选; 检查.pro文件是 INCLUDEPATH += DEPENDPATH+= 有没加入文件所在的目录 检查.pro文件是否引入两个版本不同的相同文件名的文件; Qt += GUI ============================================ 枚举类型做为信号的参数,则需对枚举类型进行注册 在include中 //定义Enum typedef enum{ ProgressType, StartType, SuccessType, StopType }SyncMsgType; //定义结构 typedef struct //实际使用中可以多增加些结构成员 { SyncMsgType msgtype; }SyncMsg; Q_DECLARE_METATYPE(SyncMsg) 在应用程序.CPP中 //连接之前再注册 qRegisterMetaType("SyncMsg"); connect(gpssyncthread, SIGNAL(syncMsgNotify(SyncMsg)), this, SLOT(syncMsgEvent(SyncMsg))); ======================================== QList listItemDatas; for (QList::iterator it=listItemDatas.begin(); it!=listItemDatas.end() ; ++it) { (*it)->colName; } ================== error: multiple types in one declaration 自定义的类 {}后面没有";" 还有一种可能是pro文件中引用了两次单元文件; 重编译方法 ===================================== expected unqualified-id before "int" 前一句的";"误写为"," ====================================== 在Bulid工程时,qmake *.pro死循环,原因:pro文件里同一文件包含两次; =========================== char *const p ; p所指向的值不能变; char cont *p; P所指向的地址不能变; =========================== error: `nameLineEdt' was not declared in this scope 函数域没有写; (函数域::函数名()) ifdef/define重覆 ============================== int main(int argc, char *argv[]) { Q_INIT_RESOURCE(qtdam); QApplication app(argc, argv); QSplashScreen *splash = new QSplashScreen; QString path=app.applicationDirPath(); IDIOMA *lang = new IDIOMA(); lang->setfile_idioma(path+"/languages.lng"); if (lang->idioma_seleccionado=="Español") splash->setPixmap(QPixmap(":/images/splash_espagnol.png")); else splash->setPixmap(QPixmap(":/images/splash.png")); splash->show(); Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop; splash->showMessage(lang->leer_idioma("1"),topRight, Qt::white); MainWindow mainWin; mainWin.show(); splash->finish(&mainWin); delete splash; return app.exec(); } =============================== 函数如果有返回值必须写,否则有造成一些不确定的错误 如: QString a() { } QString str; str = "abc"; str.append(a()); QMessageBox::warning(this, tr("呼叫"),str,QMessageBox::Ok); 上面的情况,对话框可以出来,但点击对话框中的"确定"后,程序会死在那; ===================================================== 进行信号连接时,要确保连接参数中的对象已经创建过,否则会报保护错; 图片加载不了,有可能是QT库中的插件库没有拷贝; 加载路径指令: QCoreApplication::addLibraryPath(QObject::tr("%1%2plugins").arg(QCoreApplication::applicationDirPath()).arg("/")); qDebug() << "插件加载的路径是(QCoreApplication::libraryPaths):" << QCoreApplication::libraryPaths()<(childAt(event->pos())); if (!child) return; QPixmap pixmap = *child->pixmap(); QByteArray itemData; QDataStream dataStream(&itemData, QIODevice::WriteOnly); dataStream << pixmap << QPoint(event->pos() - child->pos()); ================================================= 取得应用程序所在路径,注:结果后面未加"/" QCoreApplication::applicationDirPath() =================================================== *.hpp文件,如果改动,Bulid后对改动后代码不起作用,必须ReBulid才可以; ================================================================= 静态成员变更量 aa.h class AA { static char p[13]; }; aa.cpp char AA::p[13]; 如果没在cpp中增加"char AA::p[13];",则编译时会提示"undefined reference to...."的错误 ==================================================================== b.h 接口中引用a.h接口 使用时必须加上 include "a.h" include "b.h" 否则编译时会出现"如果没在cpp中增加"char AA::p[13];",则编译时会提示" ========================================================================= 单例模式singleton单元要最先初始化(#include放到最前面) 错误: 'Singleton' is not a template 解决方法: #include "singleton.hpp" using namespace Pattern; =========================================================== QWidget 类以模式窗体显示: dailPage = new DailForm(0,tel); dailPage->setWindowModality(Qt::ApplicationModal); dailPage->show(); ================================================================ 事件过滤写法: 其实可以通过重载QWidget::keyPressEvent()获得本类(假设是窗体)中的几乎所有键盘事件,但焦点在文本框上,就不属于窗体类啦,所以必须采用在窗体类中添加Event Filters: CustomerInfoDialog::CustomerInfoDialog(QWidget *parent) : QDialog(parent) { ... firstNameEdit->installEventFilter(this); lastNameEdit->installEventFilter(this); cityEdit->installEventFilter(this); phoneNumberEdit->installEventFilter(this); } 然后在eventFilter中处理相关键盘事件,通过target判断是否是文本框发生的键盘事件 bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event) { if (target == firstNameEdit || target == lastNameEdit || target == cityEdit || target == phoneNumberEdit) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Space) { focusNextChild(); return true; } } } return QDialog::eventFilter(target, event); } ======================================================================== 去掉窗体标题栏: setWindowFlags(Qt::FramelessWindowHint); ============================================================== ld.exe cannot find -lSDL 处理:环境变量path加入"D:/QtDevelop/umpcapp/public/SDL- 1.2.13/bin" =========================== 环境变量path的设置: D:/QtDevelop/umpcapp/public/STLport-5.1.3/bin; D:/MinGW/bin; D:/Qt/bin; D:/QtDevelop/umpcapp/public/SDL-1.2.13/bin; D:/QtDevelop/umpcapp/public/SDL_mixer-1.2.8/bin 注:STLport-5.1.3一定要放在MinGW前面,不然会出现 "QImage: out of memory, returning null image"的错误; ================================================== 如果要用到STLport库,那么在配置.pro文件时,一定要记住把stlport放在其它库的前面, 下面的写法是正确的: INCLUDEPATH += . / ../../public/STLport-5.1.3/stlport / ###这句一定要放在前面 ../../public/SDL-1.2.13/include / ../../public/common/include / ../../public/qextserialport-1.1/ ../../public/boost-1.37.0/include ================================ 如果库的依赖关系(*.dll)出错,则应用程序会出现报内存的错误,最简单的方法就是把应用程序 所需要的库直接加入环境变量path中,以造成如果库更新,原来拷在应用程序下的库没有及时更新,环境 变更path的设置例子: path += D:/QtDevelop/umpcapp/public/boost-1.37.0/lib; D:/QtDevelop/umpcapp/public/qextserialport-1.1/build 上面对应的库为: boost_system-mgw34-mt-1_37.dll;boost_thread-mgw34-mt-1_37.dll; qextserialport.dll ================================================== 编译成功后,debug下的 exe文件不能生成,请检查.pro文件中,HEADERS与SOURCES参数配置是否有错误, 比如把.h文件加入SOURCES参数中, 把.cpp加入HEADERS参数中. ========================================================== void MapScene::mouseMoveEvent ( QGraphicsSceneMouseEvent * mouseEvent ) { QPointF scenepos; scenepos = mouseEvent->scenePos(); //qDebug()
")); 注:br后要加一个空格; ======================================================= Qss 背景透明: QPushButton{ background-color: rgba( 255, 255, 255, 0% ); } ========================================== 打开指定URL地址 QUrl url("http://www.zzwtt.com"); QDesktopServices::openUrl(url); 可以打开任意URL =================================== 窗体置前: QWidget w; w.setWindowFlags(Qt::WindowStaysOnTopHint); w.show(); ================================================== 窗体不显示在任务栏: setWindowFlags(Qt::Popup) ; ============================== 注:改变*.h的内容,编译时会没有编译过程,只有改变*.cpp才会进行编译; ================================================ 编译win32 中的 dll工程配置方法(以skypebackend为例): 因为工程中的代码全是标准C++的代码,所以编译方式跟QT有点不一样, Project-properties...-Project settings页中的"This is a custom Makefile"前面的方框不要勾选; Project-properties...-Build targets 右边中的"Type"设置为"Console application"(skypebackend为控制台程序) Project-build options-Linker settings页,设置Link libraries内容为:(win32库文件) ../../../../MinGW/lib/librpcdce4.a ../../../../MinGW/lib/librpcns4.a ../../../../MinGW/lib/librpcrt4.a ============== 按回车定位到下一焦点: connect(lineEdit1, SIGNAL(returnPressed()), lineEdit2, SLOT(setFocus())); ======================================= 项目翻译 DEMO: #include #include #include int main( int argc, char **argv ) { QApplication app( argc, argv ); QTranslator translator( 0 );//Creates a QTranslator object without a parent translator.load( "ttl_zh-cn", "." );//Try to load a file called ttl_zh-cn.qm app.installTranslator( &translator );//Add the translations from ttl_zh-cn.qm to the pool of translations QPushButton hello( QPushButton::tr( "Hello world!" ), 0 ); app.setMainWidget( &hello ); hello.show(); return app.exec(); } 1.使用qmake -project生成.pro文件; 2.在.pro文件中加上如下语句: TRANSLATIONS = ttl_zh-cn.ts 3.运行如下命令: lupdate ttl.pro 生成ttl_zh-cn.ts文件;(PS:.ts的名字来自“翻译源”(translation source)) 4.运行如下命令: linguist ttl_zh-cn.ts 这时候会弹出一个图形界面工具: 1)单击左边窗口的QPushButton 2)双击中间窗口的helloworld!这时会弹出一个对话框,在Translation下输入:你好世界! 3)单击工具栏的Done and Next按钮(这个时候QPushButton的前面会变成绿色的对号)显示翻译完成 4)然后File->Release,这个是生成.qm文件(.qm来自“QT消息”Qt message),保存到当前目录下 也可以使用命令release ttl_zh-cn.ts来生成.qm文件的。 5)点击linguist“X”退出窗口,这个时候会提示保存ttl_zh-cn.ts文件,单击save,完成操作。 这一步的目的是把“你好世界!”来替代ttl_zh-cn.ts中的“unfinished”,这个只要了解就可以了,有兴趣的可以去看看QT参考文档。 5.运行如下命令: qmake ttl.pro 6.运行如下命令: make 7.运行如下命令: ./ttl 这个时候你会发现按钮是显示的是:“你好世界!” 而不是“helloworld!” PS:lupdate和lrelease命令都可以带参数-verbose,这样会显示一些提示信息。这个 参数是可选的。 通过上面的步骤可以完成正常的翻译,但对象QLineEdit的右键菜单显示的还是英文,解决方法: 把Qt/translations目录下的qt_zh_CN.ts里面的内容全部拷到自己项目ts文件的后面就可以了(也就是把两个ts文件合并) ============================================================ ==================================================== 4字节空间存INT类型: #define USERGROUP_WIDTH 5; char buff[5]; int groupid = atoi(groupId.trimmed().toAscii().data()); //得到GroupID的int值 char* gid = (char*)(&groupid); //将groupid转化为char*类型 memcpy(buff, gid, USERGROUP_WIDTH-1); char p[4]; memset(buff, 0, USERGROUP_WIDTH); memcpy(buff, p, USERGROUP_WIDTH-1); int gid = *((int*)(&buff)); ================================== 错误信息:redefinition class... 请核对 #ifndef IGPSINTERACTION_H_INCLUDED #define IGPSINTERACTION_H_INCLUDED 上面两行中的名称是否一样(出现过第两行中最后一个"D"没掉, 找了N久才查出问题, 汗~~~) 另一原因是变量定义不可放在.h文件中,如下 struct mystruct{ ... }; 是一个变量 (不可放在.h文件中实现) typedef struct MyStruct{ .... }mystruct; 其中 MyStruct是一种类型,而mystruct是一个变量 标准用法 在.h文件中 typedef struct MyStruct{ .... }; 在.cpp中定义变量 struct MyStruct mystruct; ========================================================= std::string 转QString: std::string groupName = 'abcdef'; const char *groupNameCh = groupName.c_str(); QString tmpStr = QObject::tr(groupNameCh); ================================================= 窗体在执行destory() 时,qapp对象就已经退出啦; =============================================== gsoap 项目中的错误:multiple definition of `namespaces' 解决方法:用gsoap中的工具生成的 nsmap文件(#include "UMPCServer.nsmap")引用不能写在.h中,应该要写在.cpp文件中; a.cpp: #include "UMPCServer.nsmap" 上面的写法是正确的,不能写在a.h文件中,否则就会报错 ================ 删除TreeWidget结点: void MainWindow::clearTreeWidget() { while ( treeWidget->topLevelItemCount() > 0 ) { QTreeWidgetItem *parentItem = treeWidget->takeTopLevelItem(0); QList list = parentItem->takeChildren (); for (int j = 0; j < list.size(); j++) { QTreeWidgetItem *childItem = list.at(j); delete &nodeItemData(childItem); delete childItem; } delete &nodeItemData(parentItem); delete parentItem; } } ======================================================= IGPSNestData* resolveRecord(const QSqlRecord &record,const DataType &dateType ) error: expected `,' or `...' before '&' token 解决方法 #include =========================================================== GpsSideBar::IGPSNestData* GpsSideBar::resolveRecord(const QSqlRecord &record,const GpsSideBar::DataType &dateType ); { } error: declaration of `GpsSideBar::IGPSNestData* GpsSideBar::resolveRecord(const QSqlRecord&, const GpsSideBar::DataType&)' outside of class is not definition 解决方法:去掉函数头最后的";" GpsSideBar::IGPSNestData* GpsSideBar::resolveRecord(const QSqlRecord &record,const GpsSideBar::DataType &dateType ) { } ============================================================ QTreeWidget/QTreeView 中的CheckStatus状态的级联更新 void GpsSideBar::on_treeWidget_itemChanged ( QTreeWidgetItem * item, int column ) { if (!item || column != 0) return; Qt::CheckState state = item->checkState(0); QTreeWidgetItem *parent = item->parent(); if (parent) { int number = 0; int partiallyCheckedNum = 0; for (int row = 0; row < parent->childCount(); ++row) { if (parent->child(row)->checkState(0) == Qt::Checked) ++number; if (parent->child(row)->checkState(0) == Qt::PartiallyChecked) ++partiallyCheckedNum; } if (number == 0) { if (parent->checkState(0) != Qt::Unchecked && partiallyCheckedNum == 0) parent->setCheckState(0, Qt::Unchecked); else if (parent->checkState(0) != Qt::PartiallyChecked && partiallyCheckedNum > 0) parent->setCheckState(0, Qt::PartiallyChecked); } else if (number == parent->childCount()) { if (parent->checkState(0) != Qt::Checked ) parent->setCheckState(0, Qt::Checked); } else { if (parent->checkState(0) != Qt::PartiallyChecked ) parent->setCheckState(0, Qt::PartiallyChecked); } } if (item->childCount() > 0) { int row; if (state == Qt::Checked) { for (row = 0; row < item->childCount(); ++row) { if (item->child(row)->checkState(0) != Qt::Checked) item->child(row)->setCheckState(0, Qt::Checked); } } else if (state == Qt::Unchecked ) { for (row = 0; row < item->childCount(); ++row) { if (item->child(row)->checkState(0) != Qt::Unchecked) item->child(row)->setCheckState(0, Qt::Unchecked); } } } } ========================================== 清空QTreeWidget/QTreeView 所有结点(gpssidebar.cpp文件中提取): void GpsSideBar::clearTreeWidget(QTreeWidget *treeWidget) { while ( treeWidget->topLevelItemCount() > 0 ) { QTreeWidgetItem *parentItem = treeWidget->takeTopLevelItem(0); QList list = parentItem->takeChildren (); for (int j = 0; j < list.size(); j++) { QTreeWidgetItem *childItem = list.at(j); delete &GetGPSNestData(childItem); delete childItem; } delete &GetGPSNestData(parentItem); delete parentItem; } } ========================================================== ini配置文件中的字段名是区分大小写的 ========================================================= void MainWindow::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); menu.addAction(cutAct); menu.addAction(copyAct); menu.addAction(pasteAct); menu.exec(event->globalPos()); } ================================================== 让 QLineEdit不弹出右键菜单: QLineEdit->setContextMenuPolicy(Qt::NoContextMenu); ========================================= 计算坐标两点间的角度: 第一种方法: double calcAngle(const QPointF& centerPos,const QPoint& pos) { double px1,px2,py1,py2; px1 = centerPos.x(); py1 = centerPos.y(); px2 = pos.x(); py2 = pos.y(); double x = px2 - px1; double y = py2 - py1; double hyp = sqrt(pow(x,2) + pow(y,2)); double cos = x / hyp; double rad = acos(cos); double deg = 180/(M_PI / rad); if (y < 0) { deg = -deg; } else if ((y == 0) && (x <0)) { deg = 180; } deg = deg + 90; if (deg < 0) { deg = deg + 360; } return deg; } 第二种方法: int calcAngle(const double& sx,const double& sy,const double& dx,const double& dy) { double x, y, k1, k2; x = dx - sx; y = dy - sy; if ( (x == 0) && (y == 0) ) { return 0; } if (x == 0) { if ( y < 0) return 0;在X轴上时两种结果 if ( y > 0) return 180; } if ( y == 0) { if ( x > 0 ) return 90;//在Y轴上时两种结果 if ( x < 0) return 270; } k1 = 0; //因为直线(L1)在Y轴上,所以方程为:y=0x+0;即Y=0;斜率为0 k2 = y / x; //直线(L2)的斜率为 y/x,前面已经去除了x=0或y=0的情况 int result = round(atan(fabs(k1 - k2)) * 180 / M_PI); //由于K1=0,所以 a := abs(k1 - k2) / abs(1 + k1 * k2); if ( (x > 0) && (y < 0) ) { result = 90 - result; } else if ( (x > 0) && (y > 0) ) { result = 90 + result; } else if ( (x < 0) && (y > 0) ) { result = 270 - result; } else if ( (x < 0) && (y < 0) ) { result = 270 + result; } return result; } ============================================================== void MainWindow::setCurrentFile(const QString &fileName) { curFile = fileName; if (curFile.isEmpty()) setWindowTitle(tr("Recent Files")); else setWindowTitle(tr("%1 - %2").arg(strippedName(curFile)) .arg(tr("Recent Files"))); QSettings settings("Trolltech", "Recent Files Example"); QStringList files = settings.value("recentFileList").toStringList(); files.removeAll(fileName); files.prepend(fileName); while (files.size() > MaxRecentFiles) files.removeLast(); settings.setValue("recentFileList", files); ======================================= setMouseTracking(true)是打开鼠标移动跟踪,默认情况下只有在鼠标按下后才会发送 QMouseMoveEvent() 事件,打开鼠标移动跟踪后就能够随时发送了. ================================================ QT获取mysql包含中文的值 QString lname2 = QString::fromUtf8(query.value(0).toByteArray()); qDebug()<")<