链接:http://blog.csdn.net/yangyunfeizj/article/details/7082001    作者:GoatYangYang

公司让负责qt界面开发,但是接触qt又不久,现将在项目中遇到的一些问题汇总下,一为了避免自己忘记,二希望能帮助到他人。

1.在程序关闭窗口时,显示提示窗口:

qt中有很多信号和相应的槽函数,上述问题需要拦截关闭窗口信息QWidget::close(),QWidget::closeEvent( QCloseEvent * event )重写,即对代码如下:

  1. <span style="font-family:SimSun;font-size:13px;">void QWidget::closeEvent ( QCloseEvent * event )
  2. {
  3. QMessageBox::StandardButton button;
  4. button = QMessageBox::question(this,tr("退出程序"),
  5. QString(tr("警告:程序正在运行中,是否结束操作退出?")),
  6. QMessageBox::Yes | QMessageBox::No);
  7. if(button == QMessageBox::No)
  8. {
  9. event->ignore();
  10. }
  11. else if(button == QMessageBox::Yes)
  12. {
  13. event->accept();
  14. }
  15. }</span>

2.在程序中开辟线程,需要在程序结束前结束线程,如果在程序中动态开辟了内存,需要考虑内存释放问题:

(1).开启线程, 如果程序中需要使用线程,可以通过自定义线程,继承QThread,重写QThread::run(),run()函数体内就是线程的执行过程,记得在函数最后加上事件循环QThread::exec(),再通过QThread::start()函数开启线程。

(2).结束线程,先调用QThread::exit(),结束线程事件循环,再调用QThread::wait()来阻塞主程序知道线程结束运行。

(3).内存释放问题,如果是在线程中开辟的动态内存,需要在线程结束前手动释该内存,可以在析构函数中调用delete来删除,再调用(2)中退出线程,这些可以在析构函数中实现。

补充: qt中当parent销毁时,会自动delete child对象,而对于没有parent的对象需要手动释放。

3.信号和槽问题:

(1).信号是某个对象的信号,槽也是某个对象的槽,信号和槽通过QObject::connect()联系在一起,这个联系可以再很多地方都可建立,只要确定
再调用QObject::connect()函数前,该信号和槽的对象已经存在。

(2).多线程间的通信,也可以通过信号和槽来实现。

4.qt可执行程序在他人电脑上运行显示乱码问题:

Qt目录plugins下的codecs文件夹下的内容是跟文字显示有关,如果没有这个,可能会出现中文乱码等等一些问题,解决方法如下:

a. 在主程序main开始处增加以下语句,注意要按顺序书写:

QApplication::addLibraryPath("./plugins");
 QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
 QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

b.程序其他地方,包括其他文件、类文件中,直接使用中文,建议还是用tr("中文形式"):

QString str = tr("我是中文");
lbl1.setText(str);
lbl2.setText("你好,中文!");

c.在部署目录(执行程序放置的目录)中建立子目录 plugins,之后在此目录中建立codecs子目录,将qcncodecs4.dll复制到此子目录中(根据程序需要,有可能是codecs下的其他文件),形成如下目录结构:

<app-install-dir>\plugins\codecs

d.大功告成!试试你的程序吧,漂亮的中文出现了!

其实plugins中还可以放置程序中使用的其他插件,如sql和图像处理插件(到qt安装目录下的qt\plugins下按目录结构复制你所需要文件的即可)。

5.qt加载文件,及工程工作目录与可执行文件目录的区别:

对于较大的程序,程序中可能会调用很多其它工程的dll或者需加载信息,习惯上将可执行程序单独放在一个目录下。

工作目录:一般情况下是指程序工程目录,而不是可执行程序所在目录(一般在工程目录中的debug目录下)。

有的时候可执行程序需要脱离工程目录,如将程序放在其它电脑上运行时,以下是将工作目录设置成可执行程序目录的代码:

(1). qt获得当前可执行程序目录:QDir::currentPath();

(2).修改工作目录:bool QDir::setCurrent( const QString &path ) [static];

(3).获得可执行程序所在目录:QString  QCoreApplication::applicationDirPath()  [static];

  1. <span style="font-family:SimSun;font-size:13px;">QString  dir = QApplication::applicationDirPath();
  2. QDir::setCurrent(dir);</span>

6.vs2010无法设置断点问题:The breakpoint will not currently be hit.

从菜单栏的 Tools->Options->Debugging->General  
  取消  "Require source to exactly match..." 项的选择。
  还有两个可能是
  1.  打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上。
  2. 由于Terminal Services 这个服务被禁用了,将这个服务设为自动,将这个服务启动。

以上转自:http://www.cnblogs.com/mapk/archive/2007/08/19/861943.html

对于单个断点,可以右键—>location—>勾选“allow source code to be defferent”

7.qt主程序界面退出时,想要使程序退出:

一般情况下,当程序有多个窗口时,如果没有关闭所有窗口,程序并不会终止,这是因为在窗口被创建时,默认将窗口的属性设置为QWidget::setAttribute( Qt::WA_QuitOnClose,true),即表示程序退出的条件是设置这个属性为true的所有窗口都退出。

所以如果想要主程序界面退出的时候,程序结束,只要将该窗口上述属性设置为true,其余窗口该属性设置为false,并设置应用程序app如下即可:

connect( &app,SIGNAL(lastWindowClosed()), &app, SLOT(quit());

8.qt+vs2010程序在其他为安装vs2010环境的计算机上无法运行解决方案:

通过depends工具查找程序依赖的dll,正常情况下,对于没有安装vs2010环境的计算机想要运行该程序,需要加载msvcp100.dll、msvcr100.dll、msvcp100d.dll、msvcr100d.dll,这几个dll中100表示2010版。

9.QMainWindow控件中心控件自动添加滚动条,及对窗口标题栏上的最大、最小、关闭按钮的设置:

  1. QTextEdit *edit = new QTextEdit;
  2. edit->setText(tr("hello world"));
  3. edit->setGeometry(5,5,1000,800);
  4. QScrollArea *area = new QScrollArea;
  5. setCentralWidget(area);
  6. area->setWidget(edit);//只是中心部分,其余自己自己补充

按钮设置:

setWindowFlags ( Qt::WindowFlags type )
Qt::FrameWindowHint:没有边框的窗口
Qt::WindowStaysOnTopHint://总在最上面的窗口
Qt::CustomizeWindowHint://自定义窗口标题栏,以下标志必须与这个标志一起使用才有效,否则窗口将有默认的标题栏
Qt::WindowTitleHint:显示窗口标题栏
Qt::WindowSystemMenuHint://显示系统菜单
Qt::WindowMinimizeButtonHint://显示最小化按钮
Qt::WindowMaximizeButtonHint://显示最大化按钮
Qt::WindowMinMaxButtonsHint://显示最小化按钮和最大化按钮

Qt::WindowCloseButtonHint://显示关闭按钮

10.设置窗口为模式对话框或者非模式对话框:

    QWidget :: void setWindowModality ( Qt::WindowModality windowModality )

11.当用自定义信息参数为自定义结构体时,显示error:

QObject::connect: Cannot queue arguments of type 'MediaDbAttirbute' (Make sure 'MediaDbAttirbute' is registered using qRegisterMetaType().)

解决方法:

qRegisterMetaType<MediaDbAttirbute>("MediaDbAttirbute");

转:Qt项目中遇到的一些小问题汇总的更多相关文章

  1. salesforce零基础学习(七十二)项目中的零碎知识点小总结(一)

    项目终于告一段落,虽然比较苦逼,不过也学到了好多知识,总结一下,以后当作参考. 一.visualforce标签中使用html相关的属性使用 曾经看文档没有看得仔细,导致开发的时候走了一些弯路.还好得到 ...

  2. salesforce零基础学习(一百一十二)项目中的零碎知识点小总结(四)

    本篇参考: https://trailblazer.salesforce.com/issues_view?id=a1p4V0000003znDQAQ https://salesforce.stacke ...

  3. Python+Selenium进行UI自动化测试项目中,常用的小技巧4:日志打印,longging模块(控制台和文件同时输出)

    在前段时间,为了给项目中加入日志功能,就想到了 logging 模块,百度logging一大推,都是各种复制的,并没有找到自己想要的结果:我的目的很简单,就是:在把日志写入文件的同时在控制台输出,更加 ...

  4. Python+Selenium进行UI自动化测试项目中,常用的小技巧3:写入excel表(python,xlsxwriter)

    我们在项目中可能用到excel表生成,下面的代码就是对excel表的操作: import xlsxwriter import datetime class write_excel(): def __i ...

  5. Python+Selenium进行UI自动化测试项目中,常用的小技巧2:读取配置文件(configparser,.ini文件)

    在自动化测试项目中,可能会碰到一些经常使用的但 很少变化的配置信息,下面就来介绍使用configparser来读取配置信息config.ini 读取的信息(config.ini)如下: [config ...

  6. Python+Selenium进行UI自动化测试项目中,常用的小技巧1:读取excel表,转化成字典(dict)输出

    从今天开始我将会把在项目中遇到的问题,以及常用的一些技巧来分享出来,以此来促进自己的学习和提升自己:更加方便我以后的查阅. 现在要说的是:用Python来读取excel表的数据,返回字典(dict), ...

  7. itest 开源测试管理项目中封装的下拉列表小组件:实现下拉列表使用者前后端0行代码

    导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景       像easy ui 之类的纯前端组件,也有下拉列表组件,但是使用的时候,每个下拉列表,要配一个URL ...

  8. salesforce零基础学习(八十八)项目中的零碎知识点小总结(二)

    通过做项目以及群里面的一些大神的聊天,总结一下关于项目中的两个知识点,以后当做参考. 一. 在custom setting中配置集成接口信息后刷sandbox的问题 我们做项目时,经常会遇见和其他平台 ...

  9. salesforce零基础学习(一百零三)项目中的零碎知识点小总结(五)

    本篇参考:Salesforce Admin篇(四) Security 之Two-Factor Authentication & Single Sign On https://developer ...

随机推荐

  1. WAD独立安装版USB Loader的下载和安装

    背景知识 我使用Wad Manager来安装WAD版软件,所以需要先在Wii上面把Wad Manager准备好.详情可以参考我写的另外一篇文章<Wad Manager的下载和运行>(链接: ...

  2. bzoj1823 [JSOI2010]满汉全席(2-SAT)

    1823: [JSOI2010]满汉全席 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1246  Solved: 598[Submit][Status ...

  3. [Design Pattern] Command Pattern 命令模式

    发现公司的代码好像有用到 Command Pattern,回顾重温下. Command Pattern 的类图结构如下: 参考 <Head First Design Patterns(英文版)& ...

  4. Java NIO 和 IO 的区别详解

    Java NIO为jdk1.4提供了新的API,本文主要来比较一下Java中NIO和IO的区别,Java初学者可以了解一下. 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分 ...

  5. TeamViewer或者向日葵等无法成功远程登录

    之前一直能正常远程的两台电脑,今天不知道什么原因,莫名其妙的就无法登录了. 更悲催的时,今天早上走的时候,忘把TeamViewer或者向日葵软件启动了. 还好,我登录向日葵官网,在管理中心设置里面开启 ...

  6. ceph主要数据结构解析3-Ceph_fs.h文件

    (1)集群内部子版本协议类型宏定义:与公共协议保持独立性,以便消息类型和协议升级受影响 #define CEPH_OSDC_PROTOCOL   24 /* server/client */OSD服务 ...

  7. [Angular 2] A Simple Form in Angular 2

    When you create a Form in Angular 2, you can easily get all the values from the Form using ControlGr ...

  8. Java编程 的动态性,第 2部分: 引入反射--转载

    在“ Java编程的动态性,第1部分,”我为您介绍了Java编程类和类装入.该篇文章介绍了一些Java二进制类格式的相关信息.这个月我将阐述使用Java反射API来在运行时接入和使用一些相同信息的基础 ...

  9. 使用symbolicatecrash分析crash文件

    对于我们iOS开发者来说,最心碎的事莫过于苹果审核一个星期后上架app store,而第二天就报出闪退bug.一周前我刚经历过,而且最坑的是由于第一次做个人开发,经验不足,没有集成友盟的分析SDK,还 ...

  10. git 取消追踪

    git rm --cached filePath这个操作不会删除这个文件