<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>qt 资料网</title>
	<atom:link href="http://www.xingfushenghuo.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.xingfushenghuo.com</link>
	<description>-- qt 学习网站</description>
	<lastBuildDate>Mon, 09 Aug 2010 15:17:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>MySQL导入导出方法与工具</title>
		<link>http://www.xingfushenghuo.com/?p=39</link>
		<comments>http://www.xingfushenghuo.com/?p=39#comments</comments>
		<pubDate>Mon, 09 Aug 2010 15:17:35 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=39</guid>
		<description><![CDATA[　　翻译声明：本文内容来自Sam&#8217;s Teach Yourself MySQL in 21 Days一书的部分内容，by Mark Maslakowski 英文原文版权属原作者所有，中文的部分翻译有略有增删;原书讲的过于清楚的地方有删，讲的不清楚的地方有增。
　　1）.MySQLimpo[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=39'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>　　翻译声明：本文内容来自Sam&#8217;s Teach Yourself MySQL in 21 Days一书的部分内容，by Mark Maslakowski 英文原文版权属原作者所有，中文的部分翻译有略有增删;原书讲的过于清楚的地方有删，讲的不清楚的地方有增。</p>
<p>　　1）.MySQLimport的语法介绍：</p>
<p>　　MySQLimport位于MySQL/bin目录中，是MySQL的一个载入（或者说导入）数据的一个非常有效的工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件（text file）导入到你指定的数据库和表中。比方说我们要从文件Customers.txt中把数据导入到数据库Meet_A_Geek中的表 Custermers中：</p>
<p>　　MySQLimport Meet_A_Geek Customers.txt</p>
<p>　　注意：这里Customers.txt是我们要导入数据的文本文件，而Meet_A_Geek是我们要操作的数据库，数据库中的表名是Customers，这里文本文件的数据格式必须与Customers表中的记录格式一致，否则MySQLimport命令将会出错。</p>
<p>　　其中表的名字是导入文件的第一个句号（.）前面文件字符串，另外一个例子：MySQLimport Meet_A_Geek Cus.to.mers.txt</p>
<p>　　那么我们将把文件中的内容导入到数据库Meet_A_Geek 中的Cus表中。</p>
<p>　　上面的例子中，都只用到两个参数，并没有用到更多的选项，下面介绍MySQLimport的选项</p>
<p>　　2）.MySQLimport的常用选项介绍:</p>
<p>　　选项 功能</p>
<p>　　-d or &#8211;delete 新数据导入数据表中之前删除数据数据表中的所有信息</p>
<p>　　-f or &#8211;force 不管是否遇到错误，MySQLimport将强制继续插入数据</p>
<p>　　-i or &#8211;ignore MySQLimport跳过或者忽略那些有相同唯一关键字的行， 导入文件中的数据将被忽略。</p>
<p>　　-l or -lock-tables 数据被插入之前锁住表，这样就防止了，你在更新数据库时，用户的查询和更新受到影响。</p>
<p>　　-r or -replace 这个选项与－i选项的作用相反；此选项将替代表中有相同唯一关键字的记录。</p>
<p>　　&#8211;fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的， 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。</p>
<p>　　&#8211;fields-terminated- by=char 指定各个数据的值之间的分隔符，在句号分隔的文件中，分隔符是句号。您可以用此选项指定数据之间的分隔符。</p>
<p>　　默认的分隔符是跳格符（Tab）</p>
<p>　　&#8211;lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串或者字符。 默认的情况下MySQLimport以newline为行分隔符。</p>
<p>　　您可以选择用一个字符串来替代一个单个的字符：</p>
<p>　　一个新行或者一个回车。</p>
<p>　　MySQLimport命令常用的选项还有-v 显示版本（version），-p 提示输入密码（password）等。</p>
<p>　　3）.例子：导入一个以逗号为分隔符的文件</p>
<p>　　文件中行的记录格式是这样的：</p>
<p>　　&#8221;1&#8243;, &#8220;ORD89876&#8243;, &#8220;1 Dozen Roses&#8221;, &#8220;19991226&#8243;</p>
<p>　　我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中，我们使用这个命令:</p>
<p>　　bin/MySQLimport –prl –fields-enclosed-by=&#8221; –fields-terminated-by=, Meet_A_Geek Orders.txt</p>
<p>　　这个命令可能看起来很不爽，不过当你熟悉了之后，这是非常简单的。第一部分，bin/MySQLimport ,告诉操作系统你要运行的命令是MySQL/bin目录下的MySQLimport，选项p是要求输入密码，这样就要求你在改动数据库之前输入密码，操作起来会更安全。我们用了r选项是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的，需要用文件中的数据去更新，因而就用r这个选项，替代数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表，这样就阻止了用户在我们更新表的时候对表进行查询或者更改的操作。</p>
<p>　　批处理是一种非交互式运行MySQL程序的方法，如同您在MySQL中使用的命令一样，你仍然将使用这些命令。</p>
<p>　　为了实现批处理，您重定向一个文件到MySQL程序中，首先我们需要一个文本文件，这个文本文件包含有与我们在MySQL中输入的命令相同的文本。</p>
<p>　　比如我们要插入一些数据，使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字，并不一定要以后缀sql结尾)：</p>
<p>　　USE Meet_A_Geek;</p>
<p>　　INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, &#8220;Block&#8221;);</p>
<p>　　INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, &#8220;Newton&#8221;);</p>
<p>　　INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, &#8220;Simmons&#8221;);</p>
<p>　　注意上面的这些句子的语法都必须是正确的，并且每个句子以分号结束。</p>
<p>　　上面的USE命令选择数据库，INSERT命令插入数据。</p>
<p>　　下面我们要把上面的文件导入到数据库中，导入之前要确认数据库已经在运行，即是MySQLd进程（或者说服务，Windows NT下面称为”服务“，unix下面为”进程“）已经在运行。</p>
<p>　　然后运行下面的命令：</p>
<p>　　bin/MySQL –p < /home/mark/New_Data.sql</p>
<p>　　接着按提示输入密码，如果上面的文件中的语句没有错误，那么这些数据就被导入到了数据库中。</p>
<p>　　命令行中使用LOAD DATA INFILE 从文件中导入数据到数据库:</p>
<p>　　现在您可能会问自己，"究竟为什么我要输入所有的这些SQL语句到文件中，然后通过程序运行它们呢？”</p>
<p>　　这样看起来好像需要大量的工作。很好，你这样想很可能就对了。但是假如你有从所有这些命令中产生的log记录呢？现在这样就很棒，嗯，大多数数据库都会自动产生数据库中的事件记录的 log。而大部分log都包含有用过的原始的SQL命令。因此，如果您不能从您现在的数据库中导出数据到新的MySQL数据库中使用，那么您可以使用 log和MySQL的批处理特性，来快速且方便地导入您地数据。当然，这样就省去了打字的麻烦。</p>
<p>　　LOAD DATA INFILE</p>
<p>　　这是我们要介绍的最后一个导入数据到MySQL数据库中的方法。这个命令与MySQLimport非常相似，但这个方法可以在MySQL命令行中使用。也就是说您可以在所有使用API的程序中使用这个命令。使用这种方法，您就可以在应用程序中导入您想要导入的数据。</p>
<p>　　使用这个命令之前，MySQLd进程（服务）必须已经在运行。</p>
<p>　　启动MySQL命令行：</p>
<p>　　bin/MySQL –p</p>
<p>　　按提示输入密码，成功进入MySQL命令行之后，输入下面的命令：</p>
<p>　　USE Meet_A_Geek;</p>
<p>　　LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders;</p>
<p>　　简单的讲，这样将会把文件data.sql中的内容导入到表Orders中，如MySQLimport工具一样，这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中，您可以使用下面的命令：</p>
<p>　　LOAD DATA LOCAL INFILE "C:\\MyDocs\\SQL.txt" INTO TABLE Orders;</p>
<p>　　上面的LOCAL参数表示文件是本地的文件，服务器是您所登陆的服务器。</p>
<p>　　这样就省去了使用ftp来上传文件到服务器，MySQL替你完成了.</p>
<p>　　您也可以设置插入语句的优先级，如果您要把它标记为低优先级（LOW_PRIORITY），那么MySQL将会等到没有其他人读这个表的时候，才把插入数据。可以使用如下的命令：</p>
<p>　　LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders;</p>
<p>　　您也可以指定是否在插入数据的时候，取代或者忽略文件与数据表中重复的键值。替代重复的键值的语法：</p>
<p>　　LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders;</p>
<p>　　上面的句子看起来有点笨拙，但却把关键字放在了让您的剖析器可以理解的地方。</p>
<p>　　下面的一对选项描述了文件的记录格式，这些选项也是在MySQLimport工具中可以用的。他们在这里看起来有点不同。首先，要用到FIELDS关键字，如果用到这个关键字，MySQL剖析器希望看到至少有下面的一个选项：</p>
<p>　　TERMINATED BY character</p>
<p>　　ENCLOSED BY character</p>
<p>　　ESCAPED BY character</p>
<p>　　这些关键字与它们的参数跟MySQLimport中的用法是一样的. The</p>
<p>　　TERMINATED BY 描述字段的分隔符，默认情况下是tab字符（\\t）</p>
<p>　　ENCLOSED BY描述的是字段的括起字符。比方以引号括起每一个字段。</p>
<p>　　ESCAPED BY 描述的转义字符。默认的是反些杠（backslash：\\ ）.</p>
<p>　　下面仍然使用前面的MySQLimport命令的例子，用LOAD DATA INFILE语句把同样的文件导入到数据库中:</p>
<p>　　LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDS TERMINATED BY ','</p>
<p>　　ENCLOSED BY '"';</p>
<p>　　LOAD DATA INFILE语句中有一个MySQLimport工具中没有特点：</p>
<p>　　LOAD DATA INFILE 可以按指定的列把文件导入到数据库中。</p>
<p>　　当我们要把数据的一部分内容导入的时候，这个特点就很重要。比方说，我们要从Access数据库升级到MySQL数据库的时候，需要加入一些栏目（列/字段/field）到MySQL数据库中，以适应一些额外的需要。</p>
<p>　　这个时候，我们的Access数据库中的数据仍然是可用的，但是因为这些数据的栏目(field)与MySQL中的不再匹配，因此而无法再使用 MySQLimport工具。尽管如此，我们仍然可以使用LOAD DATA INFILE，下面的例子显示了如何向指定的栏目(field)中导入数据：</p>
<p>　　LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID);</p>
<p>　　如您所见，我们可以指定需要的栏目（fields）。这些指定的字段依然是以括号括起，由逗号分隔的，如果您遗漏了其中任何一个，MySQL将会提醒您^_^</p>
<p>　　Importing Data from Microsoft Access （从Access中导入数据，略）</p>
<p>　　您可以看到MySQL有很多可以导入数据的方法，然而这些只是数据传输中的一半。另外的一般是从MySQL数据库中导出数据。有许多的原因我们需要导出数据。一个重要的原因是用于备份数据库。数据的造价常常是昂贵的，需要谨慎处理它们。经常地备份可以帮助防止宝贵数据地丢失；另外一个原因是，也许您希望导出数据来共享。 在这个信息技术不断成长的世界中，共享数据变得越来越常见。</p>
<p>　　比方说Macmillan USA维护护着一个将要出版的书籍的大型数据库。这个数据库在许多书店之间共享，这样他们就知道哪些书将会很快出版。医院越来越走向采用无纸病历记录，这样这些病历可以随时跟着你。世界变得越来越小，信息也被共享得越来越多。有很多中导出数据得方法，它们都跟导入数据很相似。因为，毕竟，这些都只是一种透视得方式。从数据库导出的数据就是从另一端导入的数据。这里我们并不讨论其他的数据库各种各样的导出数据的方法，您将学会如何用MySQL来实现数据导出。</p>
<p>　　使用MySQLdump:</p>
<p>　　MySQLdump命令位于MySQL/bin/目录中</p>
<p>　　MySQLdump工具很多方面类似相反作用的工具MySQLimport。它们有一些同样的选项。但MySQLdump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式（Schema，后面有解释）并且将其转换成DDL语法（CREATE语句，即数据库定义语句），取得所有的数据，并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。</p>
<p>　　因此，如果您像装载整个数据库Meet_A_Geek的内容到一个文件中，可以使用下面的命令：</p>
<p>　　bin/MySQLdump –p Meet_A_Geek > MeetAGeek_Dump_File.txt</p>
<p>　　这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出到一个文件，可以使用下面的命令：</p>
<p>　　bin/MySQLdump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt</p>
<p>　　这个非常的灵活，您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。要达到这样的目的，可以使用类似于下面的命令：</p>
<p>　　bin/MySQLdump –p –where=&#8221;Order_ID > 2000&#8243; Meet_A_Geek Orders > Special_Dump.txt</p>
<p>　　MySQLdump工具有大量的选项，部分选项如下表：</p>
<p>　　选项/Option 作用/Action Performed</p>
<p>　　&#8211;add-drop-table</p>
<p>　　这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句，这样可以保证导回MySQL数据库的时候不会出错，因为每次导回的时候，都会首先检查表是否存在，存在就删除</p>
<p>　　&#8211;add-locks</p>
<p>　　这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作</p>
<p>　　-c or &#8211; complete_insert</p>
<p>　　这个选项使得MySQLdump命令给每一个产生INSERT语句加上列（field）的名字。当把数据导出导另外一个数据库时这个选项很有用。</p>
<p>　　&#8211;delayed-insert 在INSERT命令中加入DELAY选项</p>
<p>　　-F or -flush-logs 使用这个选项，在执行导出之前将会刷新MySQL服务器的log.</p>
<p>　　-f or -force 使用这个选项，即使有错误发生，仍然继续导出</p>
<p>　　&#8211;full 这个选项把附加信息也加到CREATE TABLE的语句中</p>
<p>　　-l or -lock-tables 使用这个选项，导出表的时候服务器将会给表加锁。</p>
<p>　　-t or -no-create- info</p>
<p>　　这个选项使的MySQLdump命令不创建CREATE TABLE语句，这个选项在您只需要数据而不需要DDL（数据库定义语句）时很方便。</p>
<p>　　-d or -no-data 这个选项使的MySQLdump命令不创建INSERT语句。</p>
<p>　　在您只需要DDL语句时，可以使用这个选项。</p>
<p>　　&#8211;opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。</p>
<p>　　-q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出，而是在读到的时候就写入导文件中。</p>
<p>　　-T path or -tab = path 这个选项将会创建两个文件，一个文件包含DDL语句或者表创建语句，另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在，并且命令的使用者有对文件的特权。</p>
<p>　　-w &#8220;WHERE Clause&#8221; or -where = &#8220;Where clause &#8221;</p>
<p>　　如前面所讲的，您可以使用这一选项来过筛选将要放到导出文件的数据。</p>
<p>　　假定您需要为一个表单中要用到的帐号建立一个文件，经理要看今年（2004年）所有的订单（Orders），它们并不对DDL感兴趣，并且需要文件有逗号分隔，因为这样就很容易导入到Excel中。 为了完成这个人物，您可以使用下面的句子：</p>
<p>　　bin/MySQLdump –p –where &#8220;Order_Date >=&#8217;2000-01-01&#8242;&#8221;</p>
<p>　　–tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders</p>
<p>　　这将会得到您想要的结果。</p>
<p>　　schema：模式The set of statements, expressed in data definition language, that completely describe the structure of a data base.</p>
<p>　　一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。</p>
<p>　　SELECT INTO OUTFILE ：</p>
<p>　　如果您觉得MySQLdump工具不够酷，就使用SELECT INTO OUTFILE吧, MySQL同样提供一个跟LOAD DATA INFILE命令有相反作用的命令，这就是SELECT INTO OUTFILE 命令，这两个命令有很多的相似之处。首先，它们有所有的选项几乎相同。现在您需要完成前面用MySQLdump完成的功能，可以依照下面的步骤进行操作：</p>
<p>　　1. 确保MySQLd进程（服务）已经在运行</p>
<p>　　2. cd /usr/local/MySQL</p>
<p>　　3. bin/MySQLadmin ping ；// 如果这个句子通不过，可以用这个：MySQLadmin -u root -p ping</p>
<p>　　MySQLadmin ping用于检测MySQLd的状态，is alive说明正在运行，出错则可能需要用户名和密码。</p>
<p>　　4. 启动MySQL 监听程序.</p>
<p>　　5. bin/MySQL –p Meet_A_Geek；// 进入MySQL命令行，并且打开数据库Meet_A_Geek,需要输入密码</p>
<p>　　6. 在命令行中，输入一下命令:</p>
<p>　　SELECT * INTO OUTFILE &#8216;/home/mark/Orders.txt&#8217;</p>
<p>　　FIELDS</p>
<p>　　TERMINATED BY = &#8216;,&#8217;</p>
<p>　　FROM Orders</p>
<p>　　WHERE Order_Date >= &#8217;2000-01-01&#8242;</p>
<p>　　在你按了Return（回车）之后，文件就创建了。这个句子就像一个规则的SELECT语句，只是把想屏幕的输出重定向到了文件中。这意味这您可以使用JOIN来实现多表的高级查询。这个特点也可以被用作一个报表产生器。</p>
<p>　　比方说，您可以组合这一章中讨论的方法来产生一个非常有趣的查询，试试这个：</p>
<p>　　在MySQL目录建立一个名为Report_G.rpt 的文本文件，加入下面的行：</p>
<p>　　USE Meet_A_Geek;</p>
<p>　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name)</p>
<p>　　VALUES (NULL, &#8220;Kinnard&#8221;, &#8220;Vicky&#8221;);</p>
<p>　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name)</p>
<p>　　VALUES (NULL, &#8220;Kinnard&#8221;, &#8220;Steven&#8221;);</p>
<p>　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name)</p>
<p>　　VALUES (NULL, &#8220;Brown&#8221;, &#8220;Sam&#8221;);</p>
<p>　　SELECT Last_Name INTO OUTFILE &#8216;/home/mark/Report.rpt&#8217;</p>
<p>　　FROM Customers WHERE Customer_ID > 1;</p>
<p>　　然后确认 MySQL进程在运行，并且您在MySQL目录中， 输入下面的命令：</p>
<p>　　bin/MySQL < Report_G.rpt检查您命名作为输出的文件，这个文件将会包含所有您在Customers表中输入的顾客的姓。 如您所见，您可以使用今天学到的导入/导出（import/export）的方法来帮助得到报表。</p>
<p>　　(完)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=39</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用qmake工具构建QT应用程序</title>
		<link>http://www.xingfushenghuo.com/?p=35</link>
		<comments>http://www.xingfushenghuo.com/?p=35#comments</comments>
		<pubDate>Sun, 08 Aug 2010 10:06:10 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[qmake]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=35</guid>
		<description><![CDATA[    moc命令：用于处理含Q_OBJECT语句（即用到时了信号和槽）的QT类定义头文件(或源文件)，以产生出包含QT元对象代码的标准头文件，这样经过处理后的头文件才能在源文件中使用。注意若用qmake工具来构建QT程序，可以设置规则来自动运行moc，无需我们直接运行moc来处理头文件
    q[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=35'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>    moc命令：用于处理含Q_OBJECT语句（即用到时了信号和槽）的QT类定义头文件(或源文件)，以产生出包含QT元对象代码的标准头文件，这样经过处理后的头文件才能在源文件中使用。注意若用qmake工具来构建QT程序，可以设置规则来自动运行moc，无需我们直接运行moc来处理头文件<br />
    qmake是一个跨平台的程序，使用qmake来构建QT应用程序的步骤：<br />
    qmake -project：收集项目信息，比如源文件、头文件、目标二进制文件、库位置等，生成一个跨平台的.pro项目文件（也可自己编写），这个文件用来生成Makefile文件<br />
    qmake(-makefile)：根据.pro文件生成Makefile文件。接下来就可以运行make工具来编译项目了</p>
<p>    .pro文件的格式：<br />
    TEMPLATE=app：指定模板变量，表示生成的Makefile类型。app(为默认值)建立应用程序的makefile；lib建立库的makefile；vcapp建立应用程序的Visual Studio项目文件；vclib建立库的Visual Studio项目文件；subdirs创建子目录编译方式的makefile<br />
    SUBDIRS=src1：指定子目录<br />
    TARGET=filename：指定生成的应用程序名(默认为项目名)<br />
    DEPENDPATH+=.：指定程序编译时依赖的相关路径（+=表示追加，=则表示直接指定，下面类同）<br />
    INCLUDEPATH+=.：指定头文件包含路径<br />
    DESTDIR+=bin：指定应用程序放置的目录<br />
    UI_DIR+=form：指定ui界面文件生成的头文件存放目录（ui文件会由uic命令处理并生成ui_*.h头文件）<br />
    RCC_DIR+=qrc：指定qrc资源文件生成的头文件存放目录（rcc命令会将.qrc文件转换成qrc_*.h文件）<br />
    MOC_DIR+=moc：指定moc生成的头文件存放目录（moc命令将含Q_OBJECT的头文件转换成标准.h文件）<br />
    OBJECTS_DIR+=obj：指定目标文件存放的目录<br />
    CONFIG+=qt warn_on release：指定编译配置信息，如qt表示用QT库来编译，warn_on把编译器设为输出警告信息，release编译为发布程序，还有debug、debug_and_release等<br />
    message($$(PATH))：用于qmake构建时产生消息。$${a}表示读取变量a的字符串,$$(PATH)读取环境变量PATH<br />
    win32{ }：添加作用域，把语句放在作用域中，则在其他平台上运行时会忽略<br />
    exit()：测试一个文件是否存在<br />
    error()：停止运行qmake，并打印一条错误消息<br />
    HEADERS+=hello.h：指定头文件<br />
    SOURCES+=filename.cpp：指定源文件<br />
    FORMS+=form/filename.ui：指定.ui界面设计文件<br />
    RESOURCES+=qrc/painter.qrc：指定.qrc资源文件</p>
<p>    下面是QT 4.5版的一个项目文件例子：</p>
<pre class="brush: cpp;">[/c]
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
SOURCES += main.cpp
SOURCES += glwidget.cpp
SOURCES += mainwindow.cpp
SOURCES += bubble.cpp
HEADERS += glwidget.h
HEADERS += mainwindow.h
HEADERS += bubble.h
RESOURCES += texture.qrc
QT += opengl
# install
target.path = $$[QT_INSTALL_EXAMPLES]/opengl/hellogl_es2
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS hellogl_es2.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/opengl/hellogl_es2
INSTALLS += target sources
[/c++]

   下面来构建一个简单的QT项目ButtonWindow(程序原型来自于&lt;&lt;Linux程序设计(第3版)&gt;&gt;)。程项目有两个文件ButtonWindow.h、ButtonWindow，如下：
[c language=&quot;++&quot;]</pre>
<p>// ButtonWindow.h<br />
#include <QMainWindow><br />
class ButtonWindow:public QMainWindow{<br />
    Q_OBJECT<br />
public:<br />
    ButtonWindow(QWidget *parent=0,Qt::WindowFlags flags=0);<br />
    virtual ~ButtonWindow();<br />
private slots:<br />
    void Clicked();<br />
};<br />
[/c++]</p>
<p>[/c]<br />
// ButtonWindow.cpp<br />
#include &#8220;ButtonWindow.h&#8221;<br />
#include <QPushButton><br />
#include <QApplication><br />
#include <iostream><br />
ButtonWindow::ButtonWindow(QWidget *parent,Qt::WindowFlags flags):QMainWindow(parent,flags){<br />
    //this->setCaption(&#8220;This is the window Title&#8221;);<br />
    QPushButton *button=new QPushButton(&#8220;Click Me!&#8221;,this);<br />
    button->setGeometry(50,30,70,20);<br />
    connect(button,SIGNAL(clicked()),this,SLOT(Clicked()));<br />
}<br />
ButtonWindow::~ButtonWindow(){<br />
}<br />
void ButtonWindow::Clicked(void){<br />
    std::cout<<"clicked!\n";<br />
}<br />
int main(int argc,char *argv[]){<br />
    QApplication app(argc,argv);<br />
    ButtonWindow *window=new ButtonWindow();<br />
    app.setActiveWindow(window);<br />
    window->show();<br />
    return app.exec();<br />
}<br />
[/c++]<br />
    由于用到了信号与槽，含有O_OBJECT语句，故要修改项目文件使其自动运行moc。<br />
    （1）运行qmake，生成ButtonWindow.pro项目文件。</p>
<pre class="brush: bash;">
zhouhuansheng@laptop-zhou:~/zhou/linux_programming/17/ButtonWindow$ ls
ButtonWindow.cpp  ButtonWindow.h
zhouhuansheng@laptop-zhou:~/zhou/linux_programming/17/ButtonWindow$ qmake -project
zhouhuansheng@laptop-zhou:~/zhou/linux_programming/17/ButtonWindow$ ls
ButtonWindow.cpp  ButtonWindow.h  ButtonWindow.pro
</pre>
<p>    （2）修改ButtonWindow.pro文件，增加MOC_DIR指定moc文件存放的目录，这样就会自动运行moc来处理头文件。还可增加OBJECTS_DIR指定目标文件存放的目录。修改后的项目文件如下：</p>
<pre class="brush: bash;">
######################################################################
# Automatically generated by qmake (2.01a) Wed Aug 12 21:16:15 2009
######################################################################
TEMPLATE = app
TARGET = ButtonWindow
MOC_DIR = moc
OBJECTS_DIR = obj
DEPENDPATH += .
INCLUDEPATH += .
# Input
HEADERS += ButtonWindow.h
SOURCES += ButtonWindow.cpp
</pre>
<p>（3）运行qmake，根据项目文件来生成Makefile文件。根据配置，还生成了两个子目录moc和obj。</p>
<pre class="brush: bash;">
zhouhuansheng@laptop-zhou:~/zhou/linux_programming/17/ButtonWindow$ qmake
zhouhuansheng@laptop-zhou:~/zhou/linux_programming/17/ButtonWindow$ ls
ButtonWindow.cpp  ButtonWindow.h  ButtonWindow.pro  Makefile  moc  obj
</pre>
<p>（4）接下来就可以用make来编译项目了，moc处理生成的文件会放在moc子目录下，编译生成的.o目标文件会放在obj子目录下。</p>
<pre class="brush: bash;">
zhouhuansheng@laptop-zhou:~/zhou/linux_programming/17/ButtonWindow$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -Imoc -I. -o obj/ButtonWindow.o ButtonWindow.cpp
/usr/bin/moc-qt4 -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -Imoc -I. ButtonWindow.h -o moc/moc_ButtonWindow.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -Imoc -I. -o obj/moc_ButtonWindow.o moc/moc_ButtonWindow.cpp
g++ -Wl,--no-undefined -o ButtonWindow obj/ButtonWindow.o obj/moc_ButtonWindow.o    -L/usr/lib -lQtGui -lQtCore -lpthread
zhouhuansheng@laptop-zhou:~/zhou/linux_programming/17/ButtonWindow$ ls
ButtonWindow  ButtonWindow.cpp  ButtonWindow.h  ButtonWindow.pro  Makefile  moc  obj
</pre>
<p>   用./ButtonWindow即可运行生成的程序。<br />
【转自】<a href="http://blog.csdn.net/zhoudaxia/archive/2009/08/13/4440040.aspx"></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=35</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于Qt中.pro文件命令介绍和写法</title>
		<link>http://www.xingfushenghuo.com/?p=30</link>
		<comments>http://www.xingfushenghuo.com/?p=30#comments</comments>
		<pubDate>Sun, 08 Aug 2010 09:54:13 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[qmake]]></category>
		<category><![CDATA[pro]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=30</guid>
		<description><![CDATA[第一种常用方式:
#模块设置，一般设置为app(生成应用程序,默认),subdirs(生成makefile文件编译subdirs指定的子文件夹),lib(生成库文件)
TEMPLATE = app
#指定生成的应用程序放置的目录
DESTDIR += ../bin
#指定生成的应用程序名
TARGE[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=30'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>第一种常用方式:<br />
#模块设置，一般设置为app(生成应用程序,默认),subdirs(生成makefile文件编译subdirs指定的子文件夹),lib(生成库文件)<br />
<span style="color: #ff0000;">TEMPLATE = app</span><br />
#指定生成的应用程序放置的目录<br />
<span style="color: #ff0000;">DESTDIR += ../bin</span><br />
#指定生成的应用程序名<br />
<span style="color: #ff0000;">TARGET = pksystem</span><br />
#添加或减少CONFIG的配置模块,一般采用默认即可,但是除去debug_and_release模块不会生成debug和release文件夹<br />
<span style="color: #ff0000;">#CONFIG += release<br />
CONFIG -= debug_and_release</span><br />
#指定uic命令将.ui文件转化成ui_*.h文件的存放的目录<br />
<span style="color: #ff0000;">UI_DIR += forms</span><br />
#指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录<br />
<span style="color: #ff0000;">RCC_DIR += ../tmp</span><br />
#指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录<br />
<span style="color: #ff0000;">MOC_DIR += ../tmp</span><br />
#指定目标文件的存放目录<br />
<span style="color: #ff0000;">OBJECTS_DIR += ../tmp</span><br />
#程序编译时依赖的相关路径<br />
<span style="color: #ff0000;">DEPENDPATH += . forms include qrc sources</span><br />
#头文件包含路径<br />
<span style="color: #ff0000;">INCLUDEPATH += .</span><br />
#qmake时产生的信息,$${a}读取变量a的字符串,$$(PATH)读取环境变量PATH<br />
<span style="color: #ff0000;">#message($$(PATH))</span><br />
#源文件编码方式<br />
<span style="color: #ff0000;">CODECFORSRC = GBK</span><br />
# Input<br />
#工程中包含的头文件<br />
<span style="color: #ff0000;">HEADERS += include/painter.h</span><br />
#工程中包含的.ui设计文件<br />
<span style="color: #ff0000;">FORMS += forms/painter.ui</span><br />
#工程中包含的源文件<br />
<span style="color: #ff0000;">SOURCES += sources/main.cpp sources/painter.cpp</span><br />
#工程中包含的资源文件<br />
<span style="color: #ff0000;">RESOURCES += qrc/painter.qrc</span><br />
 <br />
第二种常用方式,用于子文件夹的编译:<br />
#设定模块为子文件夹编译方式<br />
<span style="color: #ff0000;">TEMPLATE = subdirs</span><br />
#子文件夹目录,可用\换行<br />
<span style="color: #ff0000;">SUBDIRS = src1 \<br />
          src2</span></p>
<ul>
<li>
<div>写法</div>
</li>
</ul>
<p>在QT中，有一个工具qmake可以生成一个makefile文件，它是由.pro文件生成而来的，.pro文件的写法如下：</p>
<p>1. 注释<br />
从“#”开始，到这一行结束。</p>
<p>2. 指定源文件<br />
<span style="color: #ff0000;">SOURCES = *.cpp</span></p>
<p>对于多源文件，可用空格分开，如：SOURCES = 1.cpp 2.cpp3.cpp<br />
或者每一个文件可以被列在一个分开的行里面，通过反斜线另起一行，就像这样:</p>
<p><span style="color: #ff0000;">SOURCES = hello.cpp <br />
     main.cpp</span><br />
一个更冗长的方法是单独地列出每一个文件，就像这样：</p>
<p><span style="color: #808080;"> </span><span style="color: #ff0000;">   SOURCES+= hello.cpp<br />
    SOURCES +=main.cpp</span></p>
<p>这种方法中使用“+=”比“=”更安全，因为它只是向已有的列表中添加新的文件，而不是替换整个列表。</p>
<p>3. 指定头文件<br />
<span style="color: #ff0000;">HEADERS = hello.h或者HEADERS += hello.h</span></p>
<p>列出源文件的任何一个方法对头文件也都适用。</p>
<p>4. 配置信息<br />
CONFIG用来告诉qmake关于应用程序的配置信息。</p>
<p><span style="color: #ff0000;">    CONFIG+= qt warn_on release</span></p>
<p>在这里使用“+=”，是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项是更安全的。<br />
A&gt; qt部分告诉qmake这个应用程序是使用Qt来连编的。这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。<br />
B&gt; warn_on部分告诉qmake要把编译器设置为输出警告信息的。<br />
C&gt; release部分告诉qmake应用程序必须被连编为一个发布的应用程序。在开发过程中，程序员也可以使用debug来替换release</p>
<p>5. 指定目标文件名<br />
<span style="color: #ff0000;">TARGET = filename</span></p>
<p>如果不设置该项目，目标名会被自动设置为跟项目文件一样的名称</p>
<p>6. 添加界面文件(ui)<br />
<span style="color: #ff0000;">INTERFACES = filename.ui</span></p>
<p>7. 平台相关性处理<br />
我们在这里需要做的是根据qmake所运行的平台来使用相应的作用域来进行处理。为Windows平台添加的依赖平台的文件的简单的作用域看起来就像这样：</p>
<p><span style="color: #ff0000;">win32 {<br />
SOURCES += hello_win.cpp<br />
}</span></p>
<p>所以如果qmake运行在Windows上的时候，它就会把hello_win.cpp添加到源文件列表中。如果qmake运行在其它平台上的时候，它会很简单地把这部分忽略。</p>
<p>8. 如果一个文件不存在，停止qmake<br />
如果某一个文件不存在的时候，你也许不想生成一个Makefile。我们可以通过使用exists()函数来检查一个文件是否存在。我们可以通过使用error()函数把正在运行的qmake停下来。这和作用域的工作方式一样。只要很简单地用这个函数来替换作用域条件。对main.cpp文件的检查就像这样：</p>
<p><span style="color: #ff0000;">!exists( main.cpp ) {<br />
  error( &#8220;No main.cpp file found&#8221;)<br />
}</span></p>
<p>“!”用来否定这个测试，比如，如果文件存在，exists( main.cpp)是真，如果文件不存在，!exists( main.cpp )是真。</p>
<p>9. 检查多于一个的条件<br />
假设你使用Windows并且当你在命令行运行你的应用程序的时候你想能够看到qDebug()语句。除非你在连编你的程序的时候使用console设置，你不会看到输出。我们可以很容易地把console添加到CONFIG行中，这样在Windows下，Makefile就会有这个设置。但是如果告诉你我们只是想在当我们的应用程序运行在Windows下并且当debug已经在CONFIG行中的时候，添加console。这需要两个嵌套的作用域；只要生成一个作用域，然后在它里面再生成另一个。把设置放在最里面的作用域里，就像这样：</p>
<p><span style="color: #ff0000;">win32 {<br />
  debug {<br />
     CONFIG += console<br />
  }<br />
}</span></p>
<p>嵌套的作用域可以使用冒号连接起来，像这样：</p>
<p><span style="color: #ff0000;">win32:debug {<br />
CONFIG += console<br />
}</span></p>
<p>10. 摸板<br />
模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择：</p>
<p>A&gt; app -建立一个应用程序的makefile。这是默认值，所以如果模板没有被指定，这个将被使用。<br />
B&gt; lib &#8211; 建立一个库的makefile。<br />
C&gt; vcapp &#8211; 建立一个应用程序的VisualStudio项目文件。<br />
D&gt; vclib &#8211; 建立一个库的VisualStudio项目文件。<br />
E&gt; subdirs -这是一个特殊的模板，它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。</p>
<p>11. 生成Makefile<br />
当你已经创建好你的项目文件，生成Makefile就很容易了，你所要做的就是先到你所生成的项目文件那里然后输入：</p>
<p>Makefile可以像这样由“.pro”文件生成：</p>
<p><span style="color: #ff0000;">    qmake -oMakefile hello.pro</span></p>
<p>对于VisualStudio的用户，qmake也可以生成“.dsp”文件，例如：</p>
<p><span style="color: #ff0000;">    qmake -tvcapp -o hello.dsp hello.pro</span></p>
<p><span style="color: #ff0000;">【转自】<a href="http://blog.csdn.net/ziyoulang/archive/2008/09/14/2817044.aspx">http://blog.csdn.net/ziyoulang/archive/2008/09/14/2817044.aspx</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=30</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>qt 打开文件的几种方式</title>
		<link>http://www.xingfushenghuo.com/?p=26</link>
		<comments>http://www.xingfushenghuo.com/?p=26#comments</comments>
		<pubDate>Sun, 08 Aug 2010 06:03:07 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[qt 文件]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=26</guid>
		<description><![CDATA[在/usr 目录下有configurefile1.xml 文件，在程序的执行文件所在目录下有个test文件夹，test里有configurefile2.xml ；configurefile3.xml
一：工程里使用后缀为qrc的资源文件：
比如 资源文件里的内容为：
&#60;RCC&#62;
    [......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=26'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>在/usr 目录下有configurefile1.xml 文件，在程序的执行文件所在目录下有个test文件夹，test里有configurefile2.xml ；configurefile3.xml</p>
<p>一：工程里使用后缀为qrc的资源文件：</p>
<p>比如 资源文件里的内容为：</p>
<p>&lt;RCC&gt;</p>
<p>    &lt;qresource&gt;</p>
<p>              &lt;file alias=&#8221;configfile1&#8243;&gt;/usr/configurefile1.xml&lt;/file&gt;</p>
<p>              &lt;file alias=&#8221;configfile2&#8243;&gt;test/configurefile2.xml&lt;/file&gt;</p>
<p>               &lt;file&gt;test/configurefile3.xml&lt;/file&gt;</p>
<p>    &lt;/qresource&gt;</p>
<p>&lt;/RCC&gt;</p>
<p>（其中test是在工程执行文件所在路径下的一个文件夹）</p>
<p>这样在程序中：</p>
<p>QFile file1(&#8220;:/configfile1&#8243;);</p>
<p>QFile file2(&#8220;:/configfile2&#8243;);</p>
<p>QFile file3(&#8220;:/test/configurefile3.xml&#8221;);</p>
<p>file1.open(QFile::ReadOnly)；</p>
<p>file2.open(QFile::ReadOnly)；</p>
<p>file3.open(QFile::ReadOnly)；上述三条打开文件的操作都可以成功打开对应文件，</p>
<p>但是如果在资源文件里 如果对某个文件的引用里加了alias别名的操作，比如QFile file2(&#8220;:/test/configurefile2.xml&#8221;);</p>
<p>file2.open(QFile::ReadOnly)；将打开文件失败。</p>
<p>QT里“：/”表示对资源的引用，不是表示当前目录</p>
<p>二 使用相对路径</p>
<p>QFile file3(&#8220;test/configurefile3.xml&#8221;); file3.open(QFile::ReadOnly)；OPEN成功</p>
<p>三 使用绝对路径</p>
<p>QFile file1(&#8220;/usr/configurefile1.xml&#8221;);file1.open(QFile::ReadOnly)；OPEN成功</p>
<p>【转自】<a href="http://blog.csdn.net/lovesunshine2008/archive/2009/07/14/4345381.aspx">http://blog.csdn.net/lovesunshine2008/archive/2009/07/14/4345381.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=26</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新建一个QT工程的详细步骤</title>
		<link>http://www.xingfushenghuo.com/?p=23</link>
		<comments>http://www.xingfushenghuo.com/?p=23#comments</comments>
		<pubDate>Sun, 08 Aug 2010 05:53:34 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[qt 基础]]></category>
		<category><![CDATA[QT工程]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=23</guid>
		<description><![CDATA[QT? VC? C++? 怎么个关系？现在基本上搞清楚了，记录一下，之前一直用VC，只知其然，不知其所以然，而现在开发是底层的东西，所以的东西基本都自己写，跨平台的。
下面是详细步骤：
=========================================================[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=23'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>QT? VC? C++? 怎么个关系？现在基本上搞清楚了，记录一下，之前一直用VC，只知其然，不知其所以然，而现在开发是底层的东西，所以的东西基本都自己写，跨平台的。</p>
<p>下面是详细步骤：</p>
<p>=====================================================================</p>
<p>    新建一个工程文件夹，里面建立 inc（头文件） src（源文件） ui（用户界面文件） prj（工程</p>
<p>文件） 文件夹。</p>
<p>PRJ文件夹内存放工程文件， ICO为EXE图标，pro为整个工程的链接文件，qrc指定ico图标，rc为系统</p>
<p>资源。ico由qrc指定，rc通过qrc关联ico。bat为批处理，负责把工程转成vc工程<br />
新建头文件（.h）和源文件(.cpp),都是空的</p>
<p>用qt designer 设计一个对话框，存放在ui中，（*.ui）<br />
在头文件中包含 ui_mypro.h(UI_UI文件名.h)  <br />
 class ***: public QDialog,ui_dlgofmy(ui_对话框名.h)<br />
并在cpp中包含该头文件</p>
<p>所有文件准备好后，运行 prj/proj2dsp.bat批处理文件来将pro文件转换成dsp工程文件</p>
<p>用vc新建一个workspace,建成后将上一步我们生成的dsp工程添加进去，然后进行编译。</p>
<p>ok,在生成的target文件夹的bin文件夹中的 myproj_d.exe，运行，得到结果，OVER!</p>
<p>【转自】<a href="http://blog.csdn.net/adriano119/archive/2010/04/20/5507927.aspx">http://blog.csdn.net/adriano119/archive/2010/04/20/5507927.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=23</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QT中窗口刷新事件的学习总结</title>
		<link>http://www.xingfushenghuo.com/?p=21</link>
		<comments>http://www.xingfushenghuo.com/?p=21#comments</comments>
		<pubDate>Sun, 08 Aug 2010 03:54:08 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[qt 窗口]]></category>
		<category><![CDATA[事件]]></category>
		<category><![CDATA[窗口]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=21</guid>
		<description><![CDATA[[转]QT中窗口刷新事件的学习总结 


QT中窗口刷新事件的学习总结

一．主要理解一下几个方法和属性：
1．QWidget * QScrollView::viewport () const
2．void QWidget::paintEvent ( QPaintEvent * ) [虚 保护]
3[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=21'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<h1>[转]QT中窗口刷新事件的学习总结 </h1>
<div>
<div id="entrycns!6F7400464FEEC42A!144">
<h4 id="subjcns!6F7400464FEEC42A!144">QT中窗口刷新事件的学习总结</h4>
<div id="msgcns!6F7400464FEEC42A!144">
<p>一．主要理解一下几个方法和属性：</p>
<p>1．QWidget * QScrollView::viewport () const</p>
<p>2．void QWidget::paintEvent ( QPaintEvent * ) [虚 保护]</p>
<p>3．void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]</p>
<p>4．void QWidget::update () [槽]</p>
<p>5．void QWidget::erase ( int x, int y, int w, int h )</p>
<p>6．bool updatesEnabled</p>
<p>二．现分别详细介绍：</p>
<p>1．QWidget * QScrollView::viewport () const</p>
<p>返回滚动视图中的视口窗口部件，这个窗口部件包含内容窗口部件或者要画的区域。</p>
<p>2．void QWidget::paintEvent ( QPaintEvent * ) [虚 保护]</p>
<p>只要窗口部件需要被重绘就被调用。每个要显示输出的窗口部件必须实现它。这个事件处理器可以在子类中被重新实现来接收绘制事件。 它可以是repaint()或update()的结果。 很多窗口部件在当它们被请求时，它们很简单地重新绘制整个界面，但是一些窗口部件通过仅仅绘制被请求的区域QPaintEvent::region()进行优化，例如，QListView和QCanvas就是这样做的。</p>
<p>Qt也可通过把多个绘制事件合并为一个来加快绘制速度。当update()被调用几次或者窗口系统发送几次绘制事件，Qt把它们合并为一个比较大区域（请参考QRegion::unite()）的一个事件中。repaint()不允许这样优化，所以只要可能我们尽量使用update()。</p>
<p>当绘制事件发生，更新区域通常被擦除。这里有一些例外，通过QPaintEvent::erased()可以得知这个窗口部件是否被擦除。</p>
<p>3．void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]</p>
<p>通过立即调用paintEvent()来直接重新绘制窗口部件，如果erase为真，Qt在paintEvent()调用之前擦除区域(x,y,w,h)。 如果w是负数，它被width()-x替换，并且如果h是负数，它被height()-y替换。 如果你需要立即重新绘制，建议使用repaint()，比如在动画期间。在绝大多数情况下，update()更好，因为它允许Qt来优化速度并且防止闪烁。 警告：如果你在一个函数中调用repaint()，而它自己又被paintEvent()调用，你也许会看到无线循环。update()函数从来不会产生循环。</p>
<p>4．void QWidget::update () [槽]</p>
<p>更新窗口部件，当Qt回到主事件中时，它规划了所要处理的绘制事件。这样允许Qt进行优化从而得到比调用repaint()更快的速度和更少的闪烁。 几次调用update()的结果通常仅仅是一次paintEvent()调用。 Qt通常在paintEvent()调用之前擦除这个窗口部件的区域，仅仅只有在WRepaintNoErase窗口部件标记被设置的时候才不会。</p>
<p>5．void QWidget::erase ( int x, int y, int w, int h )</p>
<p>在窗口部件中擦除指定区域(x, y, w, h)，并不产生绘制事件。</p>
<p>如果w为负数，它被width()-x替换。如果h为负数，它被height()-y替换。</p>
<p>子窗口部件不被影响。</p>
<p>6．bool updatesEnabled</p>
<p>这个属性保存的是更新是否生效。</p>
<p>如果更新失效，调用update()和repaint()是没有效果的。如果更新失效，来自窗口系统的绘制事件会被正常处理。 setUpdatesEnabled()通常被用于在一小段事件内使更新失效，例如为了避免在大的变化期间发生屏幕闪烁。</p>
<p>实例：</p>
<p>    setUpdatesEnabled( FALSE );</p>
<p>    bigVisualChanges();</p>
<p>    setUpdatesEnabled( TRUE );</p>
<p>    repaint();</p>
<p>通过setUpdatesEnabled()设置属性值并且通过isUpdatesEnabled()来获得属性值。</p>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=21</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下安装QT-SDK</title>
		<link>http://www.xingfushenghuo.com/?p=17</link>
		<comments>http://www.xingfushenghuo.com/?p=17#comments</comments>
		<pubDate>Sun, 08 Aug 2010 03:42:41 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[qt 安装]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=17</guid>
		<description><![CDATA[一：到http://qt.nokia.com/products下载最新版的SDK安装包(Linux下面的)&#8230;得到一个bin文件(例如：qt-sdk-          linux-x86-opensource-2009.05.bin)
二：我把下载到的文件放到home下面&#8230;在[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=17'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>一：到http://qt.nokia.com/products下载最新版的SDK安装包(Linux下面的)&#8230;得到一个bin文件(例如：qt-sdk-          linux-x86-opensource-2009.05.bin)<br />
二：我把下载到的文件放到home下面&#8230;在终端中运行命令<br />
1.</p>
<pre class="brush: bash;">
chomd +x ./qt-sdk-linux-x86-opensource-2009.05.bin
</pre>
<p>  <br />
该命令让qt-sdk-linux-x86-opensource-2009.05.bin可执行  PS：在输入qt之后请按tab键(Hohohohoho)<br />
2.</p>
<pre class="brush: bash;">
sudo ./qt-sdk-linux-x86-opensource-2009.05.bin
</pre>
<p>三：接着就会出现一个图形界面，往后的安装就很简单了，这里我把它安装到/home/QT-SDK目录下</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=17</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 环境变量</title>
		<link>http://www.xingfushenghuo.com/?p=6</link>
		<comments>http://www.xingfushenghuo.com/?p=6#comments</comments>
		<pubDate>Sun, 01 Aug 2010 01:54:52 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[ubuntu 学习]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=6</guid>
		<description><![CDATA[环境变量配置文件
在Ubuntu中有如下几个文件可以设置环境变量
1、/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。
2、/etc/environment:在登录时操作系统使用的第二个文件,系统在读取[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=6'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>环境变量配置文件</p>
<p>在Ubuntu中有如下几个文件可以设置环境变量<br />
1、/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。<br />
2、/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。<br />
3、~/.bash_profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该 文件仅仅执行一次!默认情况下,他设置一些环境变游戏量,执行用户的.bashrc文件。/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.<br />
4、~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。</p>
<p>几个环境变量的优先级</p>
<p>1>2>3</p>
<p>设置永久环境变量</p>
<p>1.环境变量配置中，要先删除.bash_profile中的三行关于.bashrc的定义，然后把环境变量配置在.bashrc中<br />
2.选择要使用的java环境：update-alternatives –config java<br />
3.要使得刚修改的环境变量生效：source .bashrc<br />
4.查看环境变量：env</p>
<p>可以放到/etc/bash/bashrc，这样就是系统级的</p>
<p>环境变量命令</p>
<p>1、引言</p>
<p>在linux系统下，如果你下载并安装了应用程序，很有可能在键入它的名称时出现“command not found”的提示内容。如果每次都到安装目标文件夹内，找到可执行文件来进行操作就太繁琐了。这涉及到环境变量PATH的设置问题，而PATH的设置也 是在linux下定制环境变量的一个组成部分。本文基于RedHat 9.0，详细讲解了环境变量定制的问题。</p>
<p>2、变量简介</p>
<p>Linux是一个多用户的操作系统。每个用户登录系统后，都会有一个专用的运行环境。通常每个用户默认的环境都是相同的，这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制，其方法就是修改相应的系统环境变量。</p>
<p>3、定制环境变量</p>
<p>环境变量是和Shell紧密相关的，用户登录系统后就启动了一个Shell。对于Linux来说一般是bash，但也可以重新设定或切换到其它的 Shell。根据发行版本的情况，bash有两个基本的系统级配置文件：/etc/bashrc和/etc/profile。这些配置文件包含两组不同的 变量：shell变量和环境变量。前者只是在特定的shell中固定（如bash），后者在不同shell中固定。很明显，shell变量是局部的，而环 境变量是全局的。环境变量是通过Shell命令来设置的，设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来 说，可以通过变量名来访问相应的环境变量，通过export来设置环境变量。下面通过几个实例来说明。</p>
<p>3.1 使用命令echo显示环境变量</p>
<p>#本例使用echo显示常见的变量HOME</p>
<p>$ echo $HOME</p>
<p>/home/xiaosu</p>
<p>3.2 设置一个新的环境变量</p>
<p>$ export HELLO=”Hello!”</p>
<p>$ echo $HELLO</p>
<p>Hello!</p>
<p>3.3 使用env命令显示所有的环境变量</p>
<p>$ env</p>
<p>SSH_AGENT_PID=1875</p>
<p>HOSTNAME=xiaosu-latop</p>
<p>SHELL=/bin/bash</p>
<p>TERM=xterm</p>
<p>HISTSIZE=1000</p>
<p>……</p>
<p>3.4 使用set命令显示所有本地定义的Shell变量</p>
<p>$ set</p>
<p>BASH=/bin/bash</p>
<p>……</p>
<p>3.5 使用unset命令来清除环境变量</p>
<p>$ export TEST=”test” #增加一个环境变量TEST</p>
<p>$ env | grep TEST #此命令有输出，证明环境变量TEST已经存在了</p>
<p>TEST=test</p>
<p>$ unset $TEST #删除环境变量TEST</p>
<p>$ env | grep TEST #此命令无输出，证明环境变量TEST已经存在了</p>
<p>3.6 使用readonly命令设置只读变量</p>
<p>如果使用了readonly命令的话，变量就不可以被修改或清除了。示例如下：</p>
<p>$ export TEST=”Test…” #增加一个环境变量TEST</p>
<p>$ readonly TEST #将环境变量TEST设为只读</p>
<p>$ unset TEST #会发现此变量不能被删除</p>
<p>-bash: unset: TEST: cannot unset: readonly variable<br />
$ TEST=”New” #会发现此变量不能被修改</p>
<p>-bash: TEST: readonly variable</p>
<p>3.7 用C程序来访问和设置环境变量</p>
<p>对于C程序的用户来说，可以使用下列三个函数来设置或访问一个环境变量。</p>
<p>getenv()访问一个环境变量。输入参数是需要访问的变量名字，返回值是一个字符串。如果所访问的环境变量不存在，则会返回NULL。</p>
<p>setenv()在程序里面设置某个环境变量的函数。</p>
<p>unsetenv()清除某个特定的环境变量的函数。</p>
<p>另外，还有一个指针变量environ，它指向的是包含所有的环境变量的一个列表。下面的程序可以打印出当前运行环境里面的所有环境变量：</p>
<p>#include <stdio.h></p>
<p>extern char**environ;</p>
<p>int main ()</p>
<p>{</p>
<p>char**var;</p>
<p>for (var =environ;*var !=NULL;++var)</p>
<p>printf (”%s n “,*var);</p>
<p>return 0;</p>
<p>}</p>
<p>3.8 通过修改环境变量定义文件来修改环境变量。</p>
<p>需要注意的是，一般情况下，这仅仅对于普通用户适用，避免修改根用户的环境定义文件，因为那样可能会造成潜在的危险。</p>
<p>$cd #到用户根目录下</p>
<p>$ls -a #查看所有文件，包含隐藏的文件</p>
<p>$vi .bash_profile #修改环境变量定义文件</p>
<p>然后编辑你的PATH声明，其格式为：</p>
<p>PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:——:<PATH N></p>
<p>你可以自己加上指定的路径，中间用冒号隔开。环境变量更改后，在用户下次登陆时生效，如果想立刻生效，则可执行下面的语句：$source .bash_profile</p>
<p>需要注意的是，最好不要把当前路径”./”放到PATH里，这样可能会受到意想不到的攻击。完成后，可以通过$ echo $PATH查看当前的搜索路径。这样定制后，就可以避免频繁的启动位于shell搜索的路径之外的程序了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=6</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu软件安装与删除相关命令</title>
		<link>http://www.xingfushenghuo.com/?p=4</link>
		<comments>http://www.xingfushenghuo.com/?p=4#comments</comments>
		<pubDate>Sun, 01 Aug 2010 01:48:53 +0000</pubDate>
		<dc:creator>qt 学习</dc:creator>
				<category><![CDATA[ubuntu 学习]]></category>

		<guid isPermaLink="false">http://www.xingfushenghuo.com/?p=4</guid>
		<description><![CDATA[安装软件
命令： apt-get install softname1 softname2 softname3……
卸载软件
命令： apt-get remove softname1 softname2 softname3……
卸载并清除配置
命令： apt-get remove &#8211;pur[......]<p class='read-more'><a href='http://www.xingfushenghuo.com/?p=4'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>安装软件<br />
命令： apt-get install softname1 softname2 softname3……<br />
卸载软件<br />
命令： apt-get remove softname1 softname2 softname3……<br />
卸载并清除配置<br />
命令： apt-get remove &#8211;purge softname1<br />
更新软件信息数据库<br />
命令： apt-get update<br />
进行系统升级<br />
命令： apt-get upgrade<br />
搜索软件包<br />
命令： apt-cache search softname1 softname2 softname3……<br />
Deb软件包相关安装与卸载</p>
<p>安装deb软件包<br />
命令： dpkg -i xxx.deb<br />
删除软件包<br />
命令：  dpkg -r xxx.deb<br />
连同配置文件一起删除<br />
命令： dpkg -r &#8211;purge xxx.deb<br />
查看软件包信息<br />
命令： dpkg -info xxx.deb<br />
查看文件拷贝详情<br />
命令： dpkg -L xxx.deb<br />
查看系统中已安装软件包信息<br />
命令： dpkg -l<br />
重新配置软件包<br />
命令：  dpkg-reconfigure xxx</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xingfushenghuo.com/?feed=rss2&amp;p=4</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.648 seconds -->
