Qt demo — 3.Calculator Builder

要抓狂了,上次片的Qt demo–2是在3月份写的,这都6月份了~~~

好久没学Qt了,加油啊!

这个例子是在demo的/Qt Designer/Calculator Builder中,主要是介绍QUiLoader class,按照上面的介绍,就是:shows how to create a user interface from a Qt Designer from at run-time, using the QUiLoader class.

Show一下运行结果图:

demo_3_2

1.Q_INIT_RESOURCE
Initializes the resources specified by the .qrc file with the specified base name. Normally, Qt resources are loaded automatically at startup. The Q_INIT_RESOURCE() macro is necessary on some platforms for resources stored in a static library.

这在上一篇也写过的。

2.这里使用了QUiLoader机制,使UI与内部开发分离。

上午还在网上找了一篇非常详细的讲解,而且这篇讲解基本就是根据这个例子来的:

http://www.wutianqi.com/?p=2591

3.QUiLoader就是载入一个.ui文件(这个.ui被当作一个资源文件使用),然后使用这个UI,当然,这个UI的设计就不关我的事了。

demo_3_3

这个是.ui文件打开后的样子:

demo_3_1

4.记得包含头文件:

demo_3_7

5.这一段就是QUiLoader机制了:

demo_3_4

6.如果相对UI中的元素进行进一步处理,可以通过qFindChild来找到,并处理:

demo_3_5

7.元对象的自动连接信号和槽,在上面转载的那篇文章里具体讲到了:

demo_3_6

源码自己在安装的Qt中找,就不给出了。

QUiLoader:彻底分离你的Ui设计工作(含例子)

转载的~~~~

因为在qtdemo上看见了一个类似的样例,所以顺便学了这个,等会把相关样例拿出来分析一下。


 

本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。

Trolltech提供的界面所见即所得工具designer极大的简化了开发者花费在UI布局上的时间。但一部分喜欢在终端上开发的工程师认为拖拖拉拉这种伎俩实在是”雕虫小技,壮夫不为“也。即使专门的界面设计师为他设计.ui文件的话,他也嫌来来回回的重新编译麻烦。乐于自己通过QLayout手写代码进行设计。

那么QUiLoader这个工具,则可以真正做到程序师和界面师做到“鸡犬相闻,不相往来”, .ui文件不需要重新编译,就可以被程序加载,生成新的外观。

我们来看QUiLoader的实用方法
QUiLoader loader;
QFile file(“cuteqt.ui”);
file.open(QFile::ReadOnly);
QWidget *formWidget = loader.load(&file, this);
通过load函数即可根据.ui文件创建出一个对应的QWidget对象,后面的this指针是QWidget *类型的,你可以用其它窗体去作为formWidget的父窗体。父窗体被显示的时候,该formWidget窗体就会被显示,当然更好的方法是用一个QLayout来管理formWidget,因为父窗体可能不止一个子窗体。

如果你还想对cuteqt.ui中的那些子窗体信号作处理,那么可以用qFindChild去找到它们。
ui_setButton = qFindChild<QPushButton*>(this, “setButton”);
ui_clearButton = qFindChild<QPushButton*>(this, “clearButton”);
ui_textEdit = qFindChild<QTextEdit*>(this, “textEdit”);

比如你可以用
connect(ui_setButton,SIGNAL(clicked()),this,SLOT(setButtonClicked()));处理ui_setButton的clicked()信号。
但拜元对象机制所赐,还有一劳永逸的方法
QMetaObject::connectSlotsByName(this);该函数会将this的所有子对象都连接上一个槽(slot),槽的命名规范为
on_对象名_信号名,比如上面的setButton的clicked(),将会生成一个on_setButton_clicked()的槽,你只要实现该槽函数就可以了。

怎样,动态加载.ui文件的方法是不是很简单?而且这样做的好处至少有两个
1. 前期的设计会更准确,程序师和界面师只要协商好有哪些对象就可以分头工作了,彼此互不依赖
2. 界面可以独立于应用发布

下面是我的一个小例子。设计了两个ui,界面分别为
snap1snap2

在想用界面1的时候,只要 cp cuteqt.ui.1 cuteqt.ui 然后运行./uiloader即可
同理,在想用界面2的时候,只要 cp cuteqt.ui.2 cuteqt.ui 然后运行./uiloader即可
这中间不需要改动你的代码~
源码下载

关于“没有找到mingwm10.dll”的解决方案

经常遇到这个问题,每次解决后又忘掉了,这是copy下网上总结的很不错的几篇,赞一个!


1.


没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”


(windows XP) \debug 文件夹下的 *.exe 文件一双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”

这个问题可能是环境变量没设置好,可以通过我的电脑->属性->高级->环境变量来修改 PATH,这样能永久修改PATH. 现在我把”D:\Qt\2010.02.1\mingw\bin;D:\Qt\2010.02.1\qt\bin”加入到PATH后,可以运行了。


研究了 几天…又发现了问题

Qt Creator编译的程序,在其工程文件夹下会有一个debug文件夹,其中有程序的.exe可执行文件。但Qt Creator默认是用动态链接的,就是可执行程序在运行时需要相应的.dll文件。我们点击生成的.exe文件,首先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”表示缺少mingwm10.dll文件。

解决这个问题我们可以将相应的.dll文件放到系统中。在Qt Creator的安装目录的qt文件下的bin文件夹下(我安装在了D盘,所以路径是D:\Qt\2010.02.1\qt\bin),可以找到所有的相关.dll文件。在这里找到mingwm10.dll文件,将其复制到C:\WINDOWS\system文件夹下,即可。下面再提示缺少什么dll文件,都像这样解决就可以了

在Windows下部署QT程序的总结

引用说明:

本文原址链接:http://hi.baidu.com/jzinfo/blog/item/c17c3f6d4ff439fe431694c3.html

以下包括了部分网上收集的,以及qt帮助里的内容(Deploying an Application on Qt/Windows)

部署发布QT程序有两种方法

第一种,静态编译,可生成单一的可执行文件。 第二种,动态编译,需同时附上需要的dll文件。

一、静态编译

1 编译QT。

要静态编译,首先要求QT是静态编译过的。在QT目录下执行:

configure.exe -static -release make sub-src

就可以编译出静态库。如果只是用来分发程序,也可以mingw32-make release sub-src只编译一个静态库。这个过程需要1-2个小时。QT目录会变成1.8G左右。注:mingw32-make和make是一样的。

如果用VC2005平台,在编译Qt的时候,configure.exe -static -platform win32-msvc2005 然后nmake sub-src或者nmake release sub-src完成静态编译。

2 编译程序。

然后到你自己的程序目录下执行:

make clean qmake -config release make

这时会得到一个非常大的可执行程序,但也会有一个重要的问题,就是图片文件显示不出来。按照QT帮助的说法,QT里的jpeg,gif等图片的支持都是以插件的形式存在的,现在我们还没有包含任何插件。

3 加入插件

在main.cpp里:

#include <QApplication> #include <QtPlugin> //这个 Q_IMPORT_PLUGIN(qjpeg) //这个 Q_IMPORT_PLUGIN(qgif) //这个 int main(int argc, char *argv[]) { QApplication app(argc, argv); … return app.exec(); }

在.pro里加入:

QTPLUGIN += qjpeg qgif CONFIG += static

QT的帮助里就做到这里,但我编译程序时出错如下:

release/main.o(.text+0×1c9):main.cpp: undefined reference to `qt_plugin_instance_qgif()’ undefined reference to `qt_plugin_instance_qjpeg()’

经过长时间研究,发现了解决问题的办法:

4 加入LIBS

在.pro中加入: LIBS += C:/Qt/4.3.3/plugins/imageformats/libqgif.a LIBS += C:/Qt/4.3.3/plugins/imageformats/libqjpeg.a 如果QT静态编译正确的话,你应该上面这个目录下看到这两个文件libqgif.a和libqjpeg.a (据说以前的QT版本也可能是.lib或.o文件)

这时已经可以正常编译运行了。但还是需要mingwm10.dll才能运行。

5 解决MinGW的mingwm10.dll依赖问题

在Makefile.release里找到:

LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -static -Wl,-s -Wl -mthreads -Wl, -subsystem,windows

删除其中的”-mthreads”

quote:

一般只有用到 threads的时候才用到mingwm10.dll,我们通常遇到的”缺少mingwm10.dll”问题,可以在程序qmake生成 makefile.release文件后删除”-mthreads”参数即可,一般在 “LFLAGS”后面。当然,这只是临时解决方案,每次都要手动修改,也可以在编译QT前先修改qmake.h,不过不推荐这种方法。其实, mingwm10.dll也就十多K,每次发布程序时一起打包也无所谓。 更多信息可以参考: http://lists.trolltech.com/qt-interest/2006-08/thread00942-0.html http://lists.trolltech.com/qt-interest/2005-10/thread00381-0.html#msg00553

这时编译同样得到一个非常大的可执行程序(我写的这个贪吃蛇一共500多行,生成的exe有8M)。用AspPack压缩一下。就可以发给用户了(这时是2.6M)。

quote: “这样编译出来的程序比较大,可以先用strip命令去掉程序里面一些无用信息后,用ASPack或者UPX之类的压缩加壳软件压缩一下,两者的压缩率基本都达到30%多一点,压缩效果还是很明显的。”

二、动态编译

动态编译就很容易了。用QT的默认安装,把生成的release下的exe文件,和下面几个核心文件放在一个文件夹里:

MINGWM10.DLL QTGUI4.DLL QTCORE4.DLL

VC2005编译程序运行时需要的几个dll文件 Microsoft.VC80.CRT.manifest 位于x:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\\Microsoft.VC80.CRT msvcm80.dll msvcp80.dll msvcr80.dll QtCore4.dll QtGui4.dll

这样就可以运行了。但图片文件还是可能显示不出来,解决办法:把程序文件夹里,建立一个imageformats目录(必须是这个名字),把qt目录下的plugin/imageformats目录下对应的dll文件copy过去。这样动态连接就完成了。

注:可以用微软的Dependency Walker tool工具,就是一个depends.exe的程序,来查看一个exe文件跟哪些dll关联。

注:需要在完全没有装QT的系统上测试发布的程序有没有DLL依赖问题。

Author: Le Cao

Date: 2010-10-12 18:02:28 CST


2.

今天刚刚装了Qt,并运行了Qt的一个简单的example,然后运行了生成在\debug 文件夹下的 *.exe 文件,但双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。” 这个问题可能是环境变量没设置好,可以通过:我的电脑->属性->高级->环境变量来修改PATH,这样能永久修改PATH。现在我把”C:\Qt\2009.04\mingw\bin;C:\Qt\2009.04\qt\bin”加入到PATH后,可以运行了。

下面来看看mingwm10.dll的作用:

MinGW的全称是Minimalistic GNU for Windows,它提供了基于GNU GCC 和其他相关程序( make、autoconf 等等)构造Win32 程序所必需的头文件和库。也许你首先会想到Cygwin。两者都是可以将Unix 下程序在Win32下编译运行的办法。但所不同的是,Cygwin中是将完整的POSIX 系统调用映射到本地API,使用一个模拟POSIX 调用的dll。因此在实际执行时的效率比不上本地编译代码。另外一点:Cygwin的License 是GPL,也就是说你在Cygwin上平台的代码必须开放。(这个是很难让人接受的,仅仅因为移植代码就要开放源码)

而MinGW 与Cygwin的上述两点恰好相反,它将代码编译成Win32 本地代码,使用msvcrt.dll的C运行时库。而且MinGW的其他运行库不以GPL License保护,这也意味着你使用MinGW编译的代码不必公开源码。msvcrt.dll本身是随Win32平台发行的,因此这是一个完全免费的环境。

有人会问:有Visual C++、Borland C++ 等等,为什么还要用MinGW ?第一、它们不是免费的;第二、移植Unix下的C/C++程序将十分痛苦。

目前,开源社区中Unix下许许多多著名的库和程序都有了MinGW的版本(因为移植方便)。同时Win32本地 API 和其他一些库,比如DirectX 7/8/9,OpenGL都被移植到了MinGW 下,它是理想的跨平台解决方案。

但经使用发现mingw编译的程序有的还需要mingwm10.dll这个dll。

经搜索:mingwm10.dll是mingw的一个动态链接库,但不是C运行时库.

Even when using VC++ you have to ship the C runtimes, unless you use VC++ 6 which has the same C runtime as shipped with Windows already.

Volker

NOT true, because “-mthreads” is just needed for thread-safe exception handling. Since Qt DOES NOT use exceptions at all, you can safly remove this flag on a MinGW32-System.

有-mthreads链接选项则需要这个dll。怎样静态链接进去,还没有发现。

If you wish to remove the dependency on mingwm10.dll as well, here are the steps I followed.
Note: there is some discussion around the forums as to whether this is a valid solution.
It seems to work for me so far.

Edit c:\qt\qt4.2.3\mkspecs\win32-g++\qmake.conf and remove all occurrences of “-mthreads”.
Recompile Qt as above. Compile your project and the dependency on mingwm10.dll will be no longer.

I created a MT application with u++, and run it withouth mingw10.dll successfully.
This is not supposed to be possible. Multithreaded applications should be built with the “-mthreads” option given to the compiler, which will trigger dynamic linking to mingw10.dll. It is promissed that a future version of MinGW will remove this severe inconvenience.
There are long discussions about this topic on the Qt forum.

That -mthreads is needed, because it makes the compiler generate thread-safe versions of some codes.
It links with mingwm10.dll as the dll framework provide the only documented way a certain cleanup code
could be triggered after each thread terminates. (VC++ uses an undocumented way) So I can no longer hope that you somehow miraculosly removed the dependency on mingwm10.dll.

Ok, for the benefit of Anonymous, this is how you get rid of mingwm10.dll.

Edit the file $QTDIR\mkspecs\win32-g++\qmake.conf and remove all instances of -mthreads.
Then recompile your app. The mingwm10.dll is no longer a dependancy
Disclaimer: No-one seems to be entirely sure what that DLL is there for.
The best explanation I’ve seen is that it has something to do with propagating exceptions in multithreaded programs. However, Qt doesn’t use exceptions, so unless you use them yourself, it shouldn’t be a problem. I haven’t had any problems with the DLL removed, and many others have
reported smooth sailing as well. However, this could create problems if you use exceptions and
threads in your program.

As far as I know mingw-compiled multithreaded applicaions should always be dynamically linked to mingwm10.dll, so this file should be available on computers running the application. It seems that U++ somehow removes this nasty limitation. How is that possible?

Technorati : gnu, mingw
Del.icio.us : gnu, mingw
Ice Rocket : gnu, mingw
Flickr : gnu, mingw
Zooomr : gnu, mingw
Buzznet : gnu, mingw
Riya : gnu, mingw
43 Things : gnu, mingw

“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”(windows XP) 1》\debug 文件夹下的 *.exe 文件一双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。” 这个问题可能是环境变量没设置好,可以通过 我的电脑->属性->高级->环境变量来修改 PATH,这样能永久修改PATH. 现在我把”F:\ProgramFiles\Qt\2009.01\mingw\bin;F:\ProgramFiles\Qt\2009.01\qt\bin”加入到PATH后,可以运行了。 2》用 Qt designer 设计好 ***.ui 之后, 要得到所需要的 ***.h/***.cpp 文件时, 需要用到 uic.exe。一开始以为只要把uic.exe拷到*.ui同一文件夹下就可以了,当执行 uic ***.ui -o ***.h 时,提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。” 之后试了下把 ***.ui 拷到 uic.exe 的文件夹下(F:\ProgramFiles\Qt\2009.01\qt\bin),用命令行 cmd 切换到该目录下,再在执行 uic ***.ui -o ***.h, 可以得到相应的 ***.h 文件了。另外,在Qt designer中好像可以直接通过工具栏 “窗体–>查看代码” 来获得 ***.h 的代码, copy出来就OK了. 有一点需要注意:qt4之前的版本是需要 uic ***.ui -o ***.h / uic ***.ui -o ***.cpp 来得到 ***.h/***.cpp的,而在 qt4 中之需要得到 ***.h. 关于这一点在另一篇文章 “Qt4与Qt3的主要不同” 中有比较详细的说明. 既然要更新控件,那么你就需要使用QDesigner工具来重新画界面了,OK,重画只是纯体力劳动,好说。界面画好后,使用uic来根据界面生成代码文件,QT3的uic可以自动生成.h和.cpp文件,假设你在制作一个名叫TestDialog的对话框,那么 QT3的uic生成的文件则是TestDialog.h和TestDialog.cpp,所有的界面初始化工作都在cpp文件中执行,之后程序的逻辑代码也将加入这个文件,那么对于一个已经完成逻辑功能的对话框来说,如果要修改界面布局,你就不得不重新用uic生成.h和.cpp文件,然后将其中界面相关的代码复制到你已经修改的文件中,此时决不能直接用uic直接生成到修改过的文件上,因为那样你的代码将全部被冲掉。这一点上,QT4进步了,因为QT4中推荐的方法是,使用uic根据界面文件生成一个h文件,以前面的TestDialog为例,生成的文件叫做ui_TestDialog.h,其中会实现一个名为Ui_TestDialog的类,包含了界面所有控件的加载功能,而程序的逻辑功能依然使用TestDialog.h,和 TestDialog.cpp这两个功能,并在TestDialog.h中用多重继承的方法,从刚才的Ui_TestDialog类来继承出实际的 TestDialog类,在TestDialog的构造函数中,只需要使用Ui_TestDialog::setupUi()方法,就可以构建出整个界面,并且由于是从Ui_TestDialog继承来的,在逻辑代码中也可以方便的访问所有控件。从这一点来说,QT4的方法是个巨大的进步,因为ui_xxx.h中不再包含任何用户自己写的代码了,此时你想更改界面布局的话,只需要用QDesigner修改界面,再用uic生成ui_xxx.h文件,直接替换原文件就可以了。当然,QT的ui_xxx.h文件还有其它的使用方法,不一定要使用多重继承的方法,在这里我只是介绍了我认为最方便的方法。另外,如果你所设计的界面比较复杂,需要将某部分界面独立在其它Widget中设计和写逻辑代码,那么最上层的Dialog的ui_xxx.h文件还是需要手动修改的,不过相对于QT3,这样的修改还是非常简单的。

HTML generated by org-mode TAG=7.01g in emacs 23


3.

今天刚刚装了Qt,并运行了Qt的一个简单的example,然后运行了生成在\debug 或\release文件夹下的 *.exe 文件,但双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”

现在我给你你想要的结果!

1,我的电脑->属性->高级->环境变量来修改PATH,这样能永久修改PATH。

现在我把”C:\Qt\2009.04\mingw\bin;C:\Qt\2009.04\qt\bin”加入到PATH后,可以运行了。

这种方法看起来有点高级,不过不是什么好办法。那在其他电脑上运行怎么办?在设置一下?呵呵

2,把需要的那几个dll文件放在你exe文件所在目录release或debug。这样有个不好的地方就是那个目录release或debug会增加20M左右,这可不是好事。这个好在什么也不用设置,直接把release拷过去就可以运行。可以在任何微软windows里跑了,呵呵!

3,把需要的那几个dll文件放在你电脑系统c->windows->win32里,这样的话,运行其他的基于qt的应用也没有问题了,可以说是一劳永逸。最好的解决办法,对学习qt的我们来说。

这里我说的那几个dll,就是你运行时找不到的那几个dll,不是一个,报错时是一个一个的报。通常是mingwm10.dll,QtCore4.dll,QtGui4.dll。这3个是必备的,其他的就看你程序中用到什么了。这个我就不多说了。

最后你要的那些文件在你的qt安装目录里的bin里,如:C:\Qt\2009.04\qt\bin


另外,在搜索这两个dll时,QtCore4.dll,QtGui4.dll,发现/bin和/qt/bin下都有,不过在/qt/bin下的都要大一些,网上是这么解释的:
qt目录下的是qt4.5.2完整的开发框架( 库) qt/bin 下的dll 是运行你编写的qt程序所必须的。

/bin 下面得这些dll是给你的qtcreator用的,如果你自己编译qtcreator的话,就没有这些东西,而是直接用 qt/bin下的dll了。

反正我是选择了/qt/bin下的dll

Qt demo — 2.TextEdit

这个demo在Qt demo里是Main Windows里的Application。

截图:

textEdit

知识点:

1.Q_INIT_RESOURCE
    Initializes the resources specified by the .qrc file with the specified base name. Normally, Qt resources are loaded automatically at startup. The Q_INIT_RESOURCE() macro is necessary on some platforms for resources stored in a static library.

2.QSettings class
    app.setOrganizationName(“CppLeYuan”);
    app.setApplicationName(“TextEdit”);

 3.事件的accept()和ignore()

Setting the accept parameter indicates that the event receiver wants the event. Unwanted events might be propagated to the parent widget.

Setting the ignore parameter indicates that the event receiver does not want the event. Unwanted events might be propagated to the parent widget.

在豆子博客第20篇讲的不错:

http://devbean.blog.51cto.com/448512/225519

 

4.Qt打开文件的函数QFileDialog::getopenFileName()

注意里面的参数。

 

5.saveAs()和saveFile()的不同应用

注意saveAs调用getopenFileName(),而saveFile是通过file.open打开。

 

6.QMessageBox的使用

1
2
3
4
5
StandardButton QMessageBox::warning ( QWidget * parent,
                                      const QString &amp; title,
                                      const QString &amp; text, S
                                      tandardButtons buttons = Ok,
                                      StandardButton defaultButton = NoButton )

 

7.setWindowModified函数的使用

 

8.新建QAction

新建QAction,以及设置快捷键setShortcuts,设置提示信息setStatusTip,最后连接信号和槽。

eg.

1
2
3
4
    newAct = new QAction(QIcon(":/images/new.png"), tr("&amp;New"), this);
    newAct-&gt;setShortcuts(QKeySequence::New);   
    newAct-&gt;setStatusTip(tr("Create a new file"));   
    connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

 

9.通过addMenu新建QMenu,并且添加QAction

eg.

1
2
3
4
    fileMenu = menuBar()-&gt;addMenu(tr("&amp;File"));
    fileMenu-&gt;addAction(newAct);
    fileMenu-&gt;addAction(openAct);
    fileMenu-&gt;addAction(saveAct);

 

10.通过addToolBar新建toolBar,并且添加QAction

1
2
3
4
    fileToolBar = addToolBar(tr("File"));
    fileToolBar-&gt;addAction(newAct);
    fileToolBar-&gt;addAction(openAct);
    fileToolBar-&gt;addAction(saveAct);</span>

 

11.statusBar()的使用

 

12.保存和设置用户偏好。

自定义函数readSettings和writeSettings这块还不懂。加亮做个记号!

 

13.关于信号槽机制与事件的区别。

这一块暂时还未完全明白。最近一段时间还得在坛子里向其他高手多请教一下,然后另开帖详细总结。

而且《C++ GUI With Qt4》第七章的ticker代码是一个理解事件不错的代码。

 

总结:

总体来说,这个demo值得多多分析几次,在Qt demo的Main Windows里面,还有其他几个诸如MDI,如何保存最近打开一项等等功能,这些都可以最后结合在一起,实现一个完整的TextEdit纯文本编辑器。

Qt demo — 1.Screenshot

最近很纠结,每天要背100多个单词,而且计算机专业课的几本书还得一天看几十面,除了数据结构外,其余三本都是小白,时间分配严重不合理,但又找不到一个十全十美的方法,最近ACM又开始废弃了,就连C++也开始淡忘了~~~真不知如何是好。

Qt也感觉到了一个瓶颈,我现在能理解为什么还有好多人学MFC了,Qt的资料和MFC的资料完全不是一个概念的,Qt的资料就我知道的只有4~5本,《C++ Gui With Qt4》是公认不把书翻烂是无法看懂的,《精通Qt4编程》是国人的一本书,想买,但是看见网上评价一般,有点打酱油的感觉,而且貌似最近出的第二版内容没变,价格却增加了20多元,真是服了~~~还有一本《The Book of Qt4:The Art of Building Qt Applications》,貌似市面上没卖的,准备去打印一本….Qt官方的白皮书《Qt White Paper》已经打印了一份看,和《C++ GUI With Qt 4》差不多,现在按照前人的经验,多多捉摸自带的demos和documents,否则真的无法理解什么是event等等~~~

今天看了Desktop下的Screenshot(全屏的屏幕截图软件),感觉很有意思,最关键的是代码简单,适合入门学习。
整体分析一下:

1.这个Screenshot继承自QWidget,由三部分组成,一个是screenshotLabel(用于显示图片),一个是optionsGroupBox(作为delaySpinBox等的框架),一个是buttonsLayout(作为new, save, quit按钮的布局)。

2.screenshotLabel中放入的是一个QPixmap部件,QPixmap可以显示图片。

3.它自己实现了一个新建button的函数,用于生成button并做一些必要的初始化及连接信号和槽。

4.它实现了一个延迟,可以在设置的秒数后再截图。而Hide This Window的CheckBox则可以选择是否在截图时隐藏这个截图软件。

5.这个程序最主要的就是用了QPixmap::grabWindow这个函数,抓取图片的。

下面是软件的截图:

代码就不上传了,在Qt Demo里可以找到~~~