学习Qt的一些问题汇总

时间:2022-01-02 16:28:53

1、Qt的dos创建过程

第一步:使用Qt Designer设计好自己想要的界面

第二步:将设计好的界面保存起来,保存文件的后缀一定要是.ui,即如下形式:filename.ui。假设我的界面保存在自己的D盘的Qt for Qt creator目录下的gotocell目录下

第三步:到保存了.ui文件的目录下创建.cpp文件,这个文件是要运行的文件,且要调用到.ui文件

               自己的main.cpp文件如下:

               

#include<QApplication>
#include<QDialog>

#include"ui_gotocelldialog.h"

int main(int argc,char * argv[])
{
QApplication app(argc,argv);

Ui::GoToCellDialog ui;
QDialog * dialog = new QDialog;
ui.setupUi(dialog);
dialog->show();

return app.exec();
}


 

第四步:打开dos界面

第五步:切换到.ui文件所在的目录,dos中的命令有:

               d:

               cd Qt for Qt creator

               cd gotocell

               此时这个目录下只有两个文件,一个使自己在Qt Designer中所创建的gotocelldialog.ui文件和自己在第三步所创建的main.cpp文件

第六步:运行qmake命令(前提是你的qmake目录已经在环境变量PATH中)

               命令如下:

               qmake -project     //此时系统会自动将当前目录下的*.cpp和*.h文件包含到.pro的文件中,这个pro文件是以目录所在命名

               //此时在这个目录中又多了一个文件,即为gotocell.pro

 

               qmake gotocell.pro   //即在命令qmake后接上一个命令所生成的那个文件名,包括文件后缀.pro

               //此时会在这个目录下生成debug和release两个目录,同时也会生成Makefile,Makefile.Debug和Makefile.Release,不过debug和release目录此时是空的

第七步:编译文件(使用nmake命令来编译),具体命令如下:

               nmake

               //此时会在此目录中多出两个文件,一个使ui_gotocelldialog.h文件(即自己所定义的gotocell.ui文件文件名(不包括文件后缀)前面加上一个ui_前缀),另一个

               //文件是vc100.pdb文件(这个文件我不知道有什么用途)

               //同时在第六步所生成的debug和release目录不再为空了,它们中间已经有东西存在了

第八步:运行程序

               .//先进入此目录下的debug目录

                cd debug

                //在debug目录中已经有了一个.exe文件,这个文件的文件名是这个工程目录名,在自己这个例子中就是gotocell.exe

 

                //开始运行程序,只要在dos的此工程的debug目录下直接输入这个文件名(包括文件后缀)就可以了

               gotocell.exe

 

上面是自己在使用Qt Designer中可以运行得到最后结果的,由于Qt版本已经操作系统等不同的原因,上面的步骤不一定使用任何人

我只是将自己系统下生成步骤记下来,所以才有了此文章。

 

来自:http://blog.csdn.net/luyafei_89430/article/details/7994774

 

最后还是没有解决!!!2014年10月6日12:22:27

 

 

QT5.0.1在Windows下 出现QApplication:No such file or directory 问题的解决办法

 

 

上网查了一大通,基本都是Linux ubuntu等版本下的解决方案,如下csdn博客:http://blog.csdn.net/apple1985507/article/details/5435358;找了半天在这篇新浪博客找到了答案:
http://blog.sina.com.cn/s/blog_9da24f3b0101epan.html
解决方法是:在HelloWorld.pro工程项目文件中添加一行QT += widgets,然后再编译运行就OK了

 

我的pro文件改成这样

QT      +=coregui

 

greaterThan(QT_MAJOR_VERSION,4):QT+=widgets

 

TARGET=HelloWorld

TEMPLATE=app

 

SOURCES+=\

    main.cpp

 

 

QObject::connect的error: C1057: 宏扩展中遇到意外的文件结束

无解!!!!

 

2、用qcreator不能使用中文

 

1.首先把Qt Creator的编辑器设置为使用 UTF-8,下面是操作顺序:
   工具-->选项-->文本编辑器-->行为,在右侧选项界面找到文件编码选项,设置为 UTF-8。
2.使用 QTextStream 时设置编码格式,你的代码修改如下:
     QTextStream out(&file);
     out.setCodec("utf-8");
     QString str("物品名称");

3.用editplus打开相应的文件,然后另存为utf-8就可以了= =

 

 

3、moc_dialog.obj:-1:error: LNK2019: 无法解析的外部符号 "private: void __thiscall Dialog::showFile(void)"(?showFile@Dialog@@AAEXXZ),该符号在函数"private: static void __cdecl Dialog::qt_static_metacall(class QObject*,enum QMetaObject::Call,int,void * *)"(?qt_static_metacall@Dialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z) 中被引用

 

答:其实这种错误时因为 函数filterDetection 在头文件中有定义,但在cpp 文件中没有实现,就是说原先定义了一个控件,但不想要了却没有删干净。

 

 

4、dialog.obj:-1:error: LNK2019: 无法解析的外部符号 "public: __thiscall InputDlg::InputDlg(class QWidget *)"(??0InputDlg@@QAE@PAVQWidget@@@Z),该符号在函数"private: void __thiscall Dialog::showInputDlg(void)"(?showInputDlg@Dialog@@AAEXXZ) 中被引用

 

 

答:连接不上,先把项目qmake一下就好了

 

5、QT对话框中show和exec的区别

QDialog的显示有两个函数show()和exec()。

 

exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。
在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。

 

http://www.cnblogs.com/hujianhua/archive/2012/06/24/2559761.html

 

 

?6、在学习QPalette的时候发现window背景色和Button的显示有问题,但是不报错

 

//显示背景颜色

voidPalette::ShowWindow() //这个不知道为什么显示不出来!!!有的说是windows不支持,我也不太清楚2015年1月3日13:51:44

{

QStringListcolorList=QColor::colorNames(); //得到所有的颜色序列

QColorcolor=QColor(colorList[windowComboBox->currentIndex()]); //取得当前选中的序号,得到颜色

QPalettep=contentFrame->palette(); //得到右边的调色板

p.setColor(QPalette::Window,color); //修改相应位置的颜色

contentFrame->setPalette(p); //把调色板的值给应用上去

contentFrame->update(); //刷新界面,得到显示

/*

*QStringListcolorList=QColor::colorNames();

QColorcolor=QColor(colorList[cbbWindow->currentIndex()]);

QPalettep=contentFrame->palette();

p.setColor(QPalette::Window,color);

contentFrame->setPalette(p);

**/

}



//按钮背景颜色

voidPalette::ShowButton() //这个不知道为什么显示不出来!!!有的说是windows不支持,我也不太清楚2015年1月3日13:51:44

{

QStringListcolorList=QColor::colorNames(); //得到所有的颜色序列

QColorcolor=QColor(colorList[buttonComboBox->currentIndex()]); //取得当前选中的序号,得到颜色



QPalettep=contentFrame->palette(); //得到右边的调色板

p.setColor(QPalette::Button,color); //修改相应位置的颜色

contentFrame->setPalette(p); //把调色板的值给应用上去



contentFrame->update();

}


 

7、关于QVector!!!!!我已经被吓尿(自己理解有误)

 

inlineconstT&QVector<T>::at(inti)const

{Q_ASSERT_X(i>=0&&i<d->size,"QVector<T>::at","indexoutofrange");

 returnd->begin()[i];}

 

答:浪费我N个小时,最后看了源码才知道,真他妈坑爹,这里at的指向的是迭代器指向的第1个对象的第[i]个!!!

那么QVector<QVector<int> > av;

在这个av里面的 av.at(i).at(j)代表的意思就是这个数组里面的第一个的第i个元素的第1个的第j个元素

比如:{{1,2, 3}{4,5, 6}{7,8, 9}}

那么i=2 j=1代表的是8而不是3

 

 

8、注意第i行第j列翻译成坐标就是(j, i)

 

for(QVector<int>::size_typei=0;i!=HEIGHT;++i) //一行一行地画

    {

      for(QVector<QVector<int>>::size_typej=0;j!=WIDTH;++j)   //一个点一个点来QVector<QVector<int>>::size_type

       {

         //选到相应的点,是1还是0

         switch(map.at(i).at(j))

           {

           case0:    //是空白

  //           qDebug()<<"0=>"<<i<<","<<j;

             myPainter.setBrush(Qt::yellow);    //设置画刷

             //注意,这里坐标应该是反的,因为是i行第j列坐标就是(j,i)

             myPainter.drawPixmap(i*25,j*25,QPixmap(":/images/ground.png"));

             break;

           case1:    //是块砖

  //           qDebug()<<"1=>"<<i<<","<<j;

             myPainter.setBrush(Qt::red);    //设置画刷

             //画出砖块图形

             //注意,这里坐标应该是反的,因为是i行第j列坐标就是(j,i)

             myPainter.drawPixmap(i*25,j*25,QPixmap(":/images/stone.png"));

             break;

           default:

             qDebug()<<"idontknownwhathappen";     //未知生物出现在地图

             break;

           }

       }

    }

 

答:这里面有两个注意记住改为下面这个:

 

 

9、运行程序之后出现异常错误QIODevice::read:device not open

 

答:???不知