<?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>NIX/WIN/WEB &#187; Qt Framework</title>
	<atom:link href="http://www.formboss.net/blog/tag/qt-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.formboss.net/blog</link>
	<description>Modern Web Application Development</description>
	<lastBuildDate>Thu, 02 Feb 2012 18:43:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Qt &#8211; 3 Methods Of Adding &amp; Integrating Designer Forms</title>
		<link>http://www.formboss.net/blog/2010/08/qt-3-methods-of-adding-integrating-designer-forms/</link>
		<comments>http://www.formboss.net/blog/2010/08/qt-3-methods-of-adding-integrating-designer-forms/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 20:49:17 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Aggregation as a pointer member]]></category>
		<category><![CDATA[qt adding forms]]></category>
		<category><![CDATA[qt creator]]></category>
		<category><![CDATA[qt designer forms]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=581</guid>
		<description><![CDATA[The Qt Designer tool allows us to create forms for our application in a visual manner, freeing us from the tedium of hand-coding. While this saves time, it&#8217;s important to understand the various ways Qt creates these forms and by extension, the methods at our disposal to integrate these forms into a larger application. In [...]]]></description>
			<content:encoded><![CDATA[<p>The <em>Qt Designer</em> tool allows us to create forms for our application in a visual manner, freeing us from the tedium of hand-coding. While this saves time, it&#8217;s important to understand the various ways Qt creates these forms and by extension, the methods at our disposal to integrate these forms into a larger application.</p>
<p>In this post we&#8217;ll look at the 3 main technical options <em>Qt Designer</em> employs to serve this function:</p>
<ul>
<li> Aggregation as a pointer member</li>
<li> Aggregation</li>
<li> Multiple Inheritance</li>
</ul>
<p>We&#8217;ll also see examples of each method in practice. By the end of this post we should have a good grasp on the various ways we can use <em>Qt Designer </em>to create and integrate designer forms into a larger application.</p>
<p><span id="more-581"></span></p>
<p>When considering which method to use it&#8217;s important to understand why multiple methods exist in the first place.</p>
<p>The first part of our answer is to understand that when we design an application, our user interface will at some point need to interact with our underlying program logic and/or data structures. Thus, while we can create a new form for our application using the visual editor, it&#8217;s up to us to make a <em>programmatic</em> connection so these elements actually do something meaning ful in the context if the larger application.</p>
<p>In short then, how do we get say, a dialog box to write values to a main window? That is, how does one window (designer form) talk to another?</p>
<p>The three methods mentioned above are an abstract answer to this question.</p>
<p>So let&#8217;s open <em>Qt Creator</em> and create a basic, empty <strong>Qt GUI Application</strong>. For our purposes we&#8217;ll leave the default names the same, which means we should have a few basic files in our project:</p>
<p>main.cpp</p>
<p>mainwindow.cpp</p>
<p>mainwindow.h</p>
<p>mainwindow.ui</p>
<p>formsdemo.pro</p>
<p>At least in <em>Qt Creator</em> 2.0, the first window that should be open when we leave the create project wizard is the integrated <em>Qt Designer </em>tool. We can close that for now, as our focus is the code files <em>Qt Creator</em> has created for us.</p>
<p>Specifically, <strong>mainwindow.cpp</strong> and its definition file, <strong>mainwindow.h</strong>.</p>
<p>The contents of these files will differ based on a setting you may not have seen before:</p>
<p><strong>Qt Preferences </strong>&gt; <strong>Designer</strong> &gt; <strong>Embedding of the UI Class</strong></p>
<p>Notice the three options:</p>
<ul>
<li> Aggregation as a pointer member</li>
<li> Aggregation</li>
<li> Multiple Inheritance</li>
</ul>
<p>The default on a fresh install should the first: <strong>Aggregation as a pointer member</strong>. If it&#8217;s not, then set it as such and recreate the project (delete the one you just created and start over).</p>
<p>The reason why is with this setting <em>Qt Creator</em> designates the <strong>mainwindow.cpp</strong> and <strong>mainwindow.h</strong> files to utilize a private pointer to our <strong>Ui::MainWindow</strong> object, which is in turn defined in <strong>mainwindow.h</strong>, which itself part of the <strong>Ui::</strong> namespace, of which <strong>Ui_MainWindow</strong> is a subclass of <strong>MainWindow</strong>, our main window widget.</p>
<p>It&#8217;s a mouthful, and may not the easiest to understand strait away. The end result is that in <strong>mainwindow.cpp</strong>, so long as we include:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;mainwindow.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;ui_mainwindow.h&quot;</span></div>
</li>
</ol>
</div>
<p>&#8230;our Ui objects defined in <strong>ui_mainwindow.h</strong> should all be accessible (exposed) via our private ui-> pointer in <strong>mainwindow.cpp</strong>.</p>
<p>Sure enough, our <strong>MainWindow</strong> constructor contains a call to setupUi() using this pointer:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">MainWindow<span class="sy0">::</span><span class="me2">MainWindow</span><span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent<span class="br0">&#41;</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QMainWindow</span><span class="br0">&#40;</span>parent<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="br0">&#40;</span><span class="kw3">new</span> Ui<span class="sy0">::</span><span class="me2">MainWindow</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;setupUi<span class="br0">&#40;</span><span class="kw3">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Again, this is somewhat of a mouthful and is not always the easiest to understand. This technique gets at the heart of some of C++&#8217;s more advanced Object Oriented features, many of which could be completely foreign to you. Complexities aside, the end result is with this logic any time we need to access a Ui element in our <strong>MainWindow</strong> class, we simply use the ui-> pointer.</p>
<p>This is an incredibly important point, as it sets us up for understanding how to add and integrate our <em>own</em> designer forms. In other words, when faced with the task of linking a Ui_ definition file (<strong>ui_mainwindow.h</strong>) to the <strong>mainwindow.h</strong> and .cpp files, this is what the designers of Qt have decided to do&#8230;it&#8217;s a pretty good idea to follow this lead!</p>
<h3>Creating A New Designer Form</h3>
<p>To see why, right click on your projects name in the <strong>Protect Panel</strong> (the listing with all the project files, left and side), and from the context menu, click <strong>Add New&#8230;</strong></p>
<p>Depending on your platform and version, you need to locate the <strong>Qt Designer From Class</strong> template.</p>
<p>Choose <strong>Dialog without Buttons</strong> and click continue.</p>
<p>Now set the <strong>Class name</strong> <em>MyDialog</em>.</p>
<p>This will update the other fields in the wizard such that your header and source files will be <strong>mydialog.cpp</strong> and <strong>mydialog.h</strong> respectively.</p>
<p>Again, the first window that will open is the <em>Qt Designer</em> editor. Go ahead and add a single <strong>lineEdit</strong> item to the dialog and save and close the <em>Qt Designer </em>editor.</p>
<p>Let&#8217;s assume this dialog box needs to communicate with the <strong>MainWindow</strong> form. How do we do that?</p>
<p>We have two main options: <em>Signals and Slots</em>, and <em>Direct Exposure</em>.</p>
<h3>Signals and Slots</h3>
<p>This is perhaps the most &#8216;pure&#8217; method, as is means we do not have to force direct connections between widgets. We simply set up a signal from <strong>MyDialog</strong> and create a slot in <strong>MainWindow</strong> to process any signals it receives. The only down-side to this method is it creates more coding work, and can be harder to maintain. The upshot is as we&#8217;re using signals and slots, we have a greater ability to compose multiple objects together and only listen to the elements we choose. In short, the dialog and caller remain disconnected for the most part.</p>
<h3>Direct Exposure</h3>
<p>Direct Exposure means we manipulate the <strong>mydialog.h</strong> file to gain direct access to its ui members from the calling class, in this case <strong>MainWindow</strong>. The manipulation is a bit of a force though, as our change is making the ui-> member pointer public instead of the default private.</p>
<p>I addition to the privilege change, we must also include both <strong>mydialog.h</strong> and <strong>ui_mydialog.h</strong> in the <strong>mainwindow.cpp</strong> file.</p>
<p>The upshot to this manipulation and inclusion is our <strong>MyDialog </strong>ui members are now visible to <strong>MainWindow</strong>, and can be accessed in a manner similar to:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>m1b.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// we can now access method1 ui members like in Method2</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> value <span class="sy0">=</span> m1b.<span class="me1">ui</span><span class="sy0">-</span>&gt;lineEdit<span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;lineEdit1<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>value<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Again, it&#8217;s important to note that in order to get to this point we needed to make a private member public, as well as include two header files in our <strong>mainwindow.cpp</strong> file. This could be considered a bit of heavy-handed coding, and may not always be what you want. That said, it&#8217;s a totally legitimate solution, and is certainly less code-heavy and maintenance prone than the <em>Signals and Slots</em> approach.</p>
<h3>What About The Others?</h3>
<p>Up until this point we&#8217;ve only looked at the first of <em>Qt Creators</em> three options for creating code, <em>Aggregation as a pointer member</em>. The other two are just as important, and in some ways, perhaps a bit more convenient.</p>
<h3>Aggregation</h3>
<p>First we have <em>aggregation</em>. This is very similar in usage terms to the first, in that we aggregate the ui object into our definition file. However, as it&#8217;s not a pointer the syntax is a bit cleaner, and in terms of includes, is a bit easier to keep track of as the ui_.h file (the one created by moc), is included in the .h file of the form implementation, meaning we do not need to include it in the <strong>mainwindow.cpp</strong> class. However, we still need to make the Ui:: member public instead of private, which means we need to edit the moc generated code. This is fine, but is something you should be aware of when faced with creating many widgets.</p>
<p>The end result however, is that we can now access the ui members from <strong>MainWindow</strong>:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// must make [ Ui::Method2 ui ] public in .h</span></div>
</li>
<li class="li1">
<div class="de1">Method2 m2;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>m2.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> value <span class="sy0">=</span> m2.<span class="me1">ui</span>.<span class="me1">lineEdit</span><span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;lineEdit2<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>value<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Notice that as our Ui member was created on the stack as opposed to the heap like the first method, we access the ui elements using the member operator (.)</p>
<h3>Multiple Inheritance</h3>
<p>This is an interesting approach, as from a pedagogical standpoint many of the Qt learning tools use this method in their examples. In other words, knowing about this method helps us learn Qt.</p>
<p>As the name suggests, in this method we subclass both the Base Class of our Widget as well as the namespaced class, which designates the Ui_ class as a subclass.</p>
<p>This dependency chain thus provides our base class with direct access to our forms Ui elements. As can be seen, this makes for the cleanest, most easy-to-understand code:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// must change generated .h code to be public::</span></div>
</li>
<li class="li1">
<div class="de1">Method3 m3;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>m3.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> value <span class="sy0">=</span> m3.<span class="me1">lineEdit</span><span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;lineEdit3<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>value<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>However, it should be said this benefit comes with a price. Classes defined in this way or almost certainly less flexible for more complex projects, as now we&#8217;ve created a tight bond between ui definition and implementation.</p>
<p>Overall though it&#8217;s not a surprise why Qt chooses this method in many example code blocks, it&#8217;s the easiest to understand and totally sufficient, at least for smaller projects.</p>
<h2>Conclusion</h2>
<p>This post is rather heavy on theory, so to aid in its consumption I&#8217;ve created a test project which shows off each method. The project is purposely light on comments, as the goal here is to just open it up and stalk through the code, letting your own explorations decipher it.</p>
<p>Please keep in mind that their are no doubt other techniques and strategies/design patterns for adding and integrating Qt Designer forms.</p>
<h2>Code Download</h2>
<p>Contains a simple project showing the methods discussed in this post.</p>
<p><a href="http://www.formboss.net/blog/wp-content/uploads/2010/08/uimembers.zip">uimembers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/08/qt-3-methods-of-adding-integrating-designer-forms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 3</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:27:41 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[Porting Code]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=242</guid>
		<description><![CDATA[In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version. The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app. [...]]]></description>
			<content:encoded><![CDATA[<p>In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version.</p>
<p>The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app.</p>
<p>We&#8217;re already getting a valid directory entry from part 2, so the first step in this part is to figure out how we iterate and query files from our base folder.</p>
<p><span id="more-242"></span></p>
<p>As setup for this task, in the first app (the command line one) we defined a few globals:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// path data</span></div>
</li>
<li class="li1">
<div class="de1">string basePath <span class="sy0">=</span> argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">string imagePath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">string storyPath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>We&#8217;ll keep that basic structure, but of course implement them as member private variables. It should be noted that in the new version the &#8216;base&#8217; directory value comes from our Worker constructor with:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">Worker <span class="sy0">*</span>wk <span class="sy0">=</span> <span class="kw3">new</span> Worker<span class="br0">&#40;</span>processPathQLineEdit<span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>In the worker constructor we then:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// create path items</span></div>
</li>
<li class="li1">
<div class="de1">basePath <span class="sy0">=</span> path;</div>
</li>
<li class="li1">
<div class="de1">imagePath <span class="sy0">=</span> path <span class="sy0">+=</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">xmlPath <span class="sy0">+=</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>Same thing as the original version really, though one thing I had to check on is if using / will be a problem for Windows. <a title="QDir" href="http://doc.qt.nokia.com/4.6/qdir.html" target="_blank"><em>*Turns out the answer is no.*</em></a></p>
<p>With the setup tasks done notice that in the GUI we have two buttons: The first allows us to select the base folder, the second kicks off the Process Images task. Notice how we do this: in cleaner.enc__cppqt our clicked() SIGNAL of the <em>processButton </em>button is assigned to the processAction slot, which in turn, after creating our Worker instance object, calls cleanImages(). And so we&#8217;re getting an images directory via the GUI&#8211;so far so good!</p>
<p>This brings us to the next big question question: how do we open and iterate over directories?</p>
<h2>Iterator Over Directories</h2>
<p>As you may recall the first task of our program is to remove all files with a _bw_ in the name from the /images sub-folder. It looks like we have: <strong>QDirIterator</strong> and <strong>QDir</strong> to help us perform this duty, with the possibly of others as well. The former seems to be for general access, the latter for iterating&#8211;we want to iterate.</p>
<h3>Basic QDirIterator Implementation</h3>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;./&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Pretty strait forward really. Iterator over the directory, making sure to skip the path items.</p>
<p>This takes care of the iteration, now we need to find and remove files that have the _bw_.</p>
<p>In the old code we used:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;found <span class="sy0">=</span> name.<span class="me1">rfind</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>found <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;path <span class="sy0">=</span> imagePath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;location <span class="sy0">=</span> imagePath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> &lt;&lt; location &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> t <span class="sy0">=</span> <span class="kw3">remove</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I should step back to mention the first step was to get the file name. In the first attempt we relied on a <strong>struct</strong> returned by <strong>dirent</strong> to store file info for checking, now we have a nice simple fileName() method to call. I&#8217;m not going to lie, the Qt way feels much cleaner than the command line version. <strong>dirent </strong>was tricky to work with at first without having a debugger, this is no longer an issue in Qt. With that out of the way, what of finding the text &#8220;_bw_&#8221;?</p>
<p>I suspected, and was proven right, that QString would have some type of find function. Sure enough:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Beautiful! I can&#8217;t help but show my gratitude over such an elegant and natural thing. Without any documentation look up I was able to basically guess and implement my search function in one line. Yes std::string had the same thing with .find(), but this was a nice treat regardless.</p>
<p>Right, so now how do we delete files?</p>
<p>In the first version we had to use a separate variable (location) and a member function .c_str() to pass to the delete(char*) call. This is fine, but a touch verbose. It would be nice to encapsulate this a bit more.</p>
<h3>Delete File Implementation</h3>
<p>It turns out that we can use the same remove() call, though it wants a char*, we&#8217;ve got a QString. As was the goal anyway, we want to use native solutions for cross-platform consistency. I did some digging and found QFile. QFile has a member function for removing files: <strong>.remove()</strong>. Even better though, QDirIterator has a member function <strong>filePath()</strong> to return the full path to the file (not just file name). Of course I may have missed similar functionality in the first go (such as using QDir), but now we save ourselves the hassle of rebuilding the file path from scratch. The final code is:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Sure it&#8217;s about the same length as the original command line code, if not a bit longer, but it feels more intuitive&#8211;almost like OO PHP coding. I do not however, like the idea of creating a new QFile for each item to remove, but I&#8217;m learning&#8211;I&#8217;m sure we&#8217;ll find a better way in the next few posts.</p>
<h3>Final Method Implementation</h3>
<p>For the sake of completeness, here&#8217;s the final cleanImages() function:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Up next, <a href="porting-to-the-qt-c-framework-part-4">rewriting the cleanXMLStoryFiles() function</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 2</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:05:25 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=252</guid>
		<description><![CDATA[In this post I want to introduce the Qt code I&#8217;ve written so far. One of the strengths of the Qt framework is its well supported in NetBeans, but more importantly, by Nokia via the Qt Creator IDE. In fact, Nokia supplies a host of tools, from the IDE and language tools, an Interface Designer, [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I want to introduce the Qt code I&#8217;ve written so far. One of the strengths of the Qt framework is its well supported in NetBeans, but more importantly, by Nokia via the <a title="QT Creator IDE" href="http://qt.nokia.com/products/developer-tools">Qt Creator IDE</a>. In fact, Nokia supplies a host of tools, from the IDE and language tools, an Interface Designer, and loads of examples.</p>
<p>At the end of this post we&#8217;ll have a shell ready for the actual porting process to being. In other words, a GUI that loads, reacts to button presses, and updates status text.</p>
<p><span id="more-252"></span></p>
<p>So here&#8217;s the code:</p>
<h2>main.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;cleaner.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QApplication</span> app<span class="br0">&#40;</span>argc, argv<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Cleaner cleaner;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cleaner.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> app.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>cleaner.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;cleaner.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;worker.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Cleaner<span class="sy0">::</span><span class="me2">Cleaner</span><span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">:</span> <span class="kw5">QWidget</span><span class="br0">&#40;</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; statusLabel <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLabel</span><span class="br0">&#40;</span><span class="st0">&quot;Conversion Status:&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathLabel <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLabel</span><span class="br0">&#40;</span><span class="st0">&quot;Folder To Process&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QTextEdit</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLineEdit</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; loadButton <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QPushButton</span><span class="br0">&#40;</span><span class="st0">&quot;Select Folder&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; loadButton<span class="sy0">-</span>&gt;setToolTip<span class="br0">&#40;</span><span class="st0">&quot;Select a folder to load Prestige export data from&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QPushButton</span><span class="br0">&#40;</span><span class="st0">&quot;Process Folder&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QGridLayout</span> <span class="sy0">*</span>mainLayout <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QGridLayout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>statusLabel, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processStatusText, <span class="nu0">1</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processPathLabel, <span class="nu0">2</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processPathQLineEdit, <span class="nu0">3</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QVBoxLayout</span> <span class="sy0">*</span>buttonLayout1 <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QVBoxLayout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; buttonLayout1<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>loadButton, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; buttonLayout1<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processButton, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addLayout<span class="br0">&#40;</span>buttonLayout1, <span class="nu0">1</span>, <span class="nu0">1</span>, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setLayout<span class="br0">&#40;</span>mainLayout<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setWindowTitle<span class="br0">&#40;</span><span class="st0">&quot;Prestige Export File Cleaner&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// signal and slots</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>loadButton, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>clicked<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>loadAction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>processButton, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>clicked<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>processAction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Cleaner<span class="sy0">::</span><span class="me2">loadAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// main folder name to use</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPath <span class="sy0">=</span> <span class="kw5">QFileDialog</span><span class="sy0">::</span><span class="me2">getExistingDirectory</span><span class="br0">&#40;</span><span class="kw3">this</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;Prestige Export Folder&quot;</span>, <span class="st0">&quot;&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw5">QFileDialog</span><span class="sy0">::</span><span class="me2">ShowDirsOnly</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>processPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Cleaner<span class="sy0">::</span><span class="me2">processAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span><span class="st0">&quot;Starting Process&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker <span class="sy0">*</span>wk <span class="sy0">=</span> <span class="kw3">new</span> Worker<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>wk<span class="sy0">-</span>&gt;cleanImages<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>cleaner.h</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef CLEANER_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define CLEANER_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QLabel</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QLineEdit</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QTextEdit</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QPushButton</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Cleaner <span class="sy0">:</span> <span class="kw2">public</span> <span class="kw5">QWidget</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">Q_OBJECT</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Cleaner<span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent <span class="sy0">=</span> <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">slots</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> loadAction<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> processAction<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLineEdit</span> <span class="sy0">*</span>processPathQLineEdit;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLabel</span> <span class="sy0">*</span>statusLabel;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLabel</span> <span class="sy0">*</span>processPathLabel;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QTextEdit</span> <span class="sy0">*</span>processStatusText;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QPushButton</span> <span class="sy0">*</span>loadButton;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QPushButton</span> <span class="sy0">*</span>processButton;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> processPath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // CLEANER_H</span></div>
</li>
</ol>
</div>
<h2>worker.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;worker.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Worker<span class="sy0">::</span><span class="me2">Worker</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; br <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; nl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rn <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; openp <span class="sy0">=</span> <span class="st0">&quot;&lt;p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; closep <span class="sy0">=</span> <span class="st0">&quot;&lt;/p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; doublebr <span class="sy0">=</span> <span class="st0">&quot;&lt;br/&gt;&lt;br/&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span><span class="st0">&quot;Done!&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Worker<span class="sy0">::</span><span class="me2">cleanXMLStoryFiles</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>worker.h</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef WORKER_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define WORKER_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Worker</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker<span class="br0">&#40;</span><span class="kw5">QString</span> dir<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// functions</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> cleanImages<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> cleanXMLStoryFiles<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// status</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> statusMessages;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> br;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> rl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> nl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> rn;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> openp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> closep;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> doublebr;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // WORKER_H</span></div>
</li>
</ol>
</div>
<p>The biggest thing to note about this code is that we&#8217;re not using the <em>Qt Designer</em> program to create the UI. It&#8217;s all hand coded, done for the sake of learning the core UI model. If you&#8217;re learning Qt I suggest you try this as well. Yes the Qt Designer tool is fantastic and <em>yes </em>I&#8217;ll use it for most tasks moving forward, but for this project we&#8217;ll keep it low-level.</p>
<h2>Core Implementation</h2>
<p>On the implementation level it&#8217;s important to note that we&#8217;re using a totally object oriented approach to the UI and logic. Speaking of UI and Logic, note how we&#8217;ve split the app in two logical components: cleaner.enc__cppqt which holds the presentation logic, worker.enc__cppqt for the &#8216;model&#8217;.</p>
<p>On a releated note, as the XML logic will almost certainly get parallelized we&#8217;ll take special note of how we add and handle additional classes and data structures. From what I can see Qt may want all parallel code in separate classes, so we&#8217;ll see. We may end up editing the core functionality of worker.enc__cppqt, or possibly add a workerXML.ccp to the mix.</p>
<p>Also note how our call to: <em>QFileDialog::getExistingDirectory()</em> via: <em>void Cleaner::loadAction()</em> in cleaner.enc__cppqt is how we get the file path to process. In short, we&#8217;ve already replaced the command line apps argument with a GUI based equivalent!</p>
<p>To that end notice that as of right now we still have implementation bugs. So for example we create pointer to an instance of Worker on the heap in processAction() but do not call delete() on it. Of course this is wrong, and we&#8217;ll fix that in time&#8211;for now though the main idea is this code creates the UI which reacts to member functions of the worker class.</p>
<h2>Next Steps</h2>
<p>That&#8217;s it for the core UI code, in part 2 we&#8217;ll start porting our base application.</p>
<p>Go To Part 3 &#8211;&gt;<br />
<a href="porting-to-the-qt-c-framework-part-3">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 1</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-1/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-1/#comments</comments>
		<pubDate>Thu, 27 May 2010 04:15:51 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=227</guid>
		<description><![CDATA[In this post we&#8217;ll start the process of porting a simple command line C++ application to the Nokia Qt framework. Well take a quick look at the code in question, then talk about how we&#8217;ll port it. The application in question is a simple tool for cleaning up the export of a Print Publishing CMS [...]]]></description>
			<content:encoded><![CDATA[<p>In this post we&#8217;ll start the process of porting a simple command line C++ application to the <a title="Nokia Qt Framework" href="http://qt.nokia.com/products" target="_blank">Nokia Qt framework</a>. Well take a quick look at the code in question, then talk about how we&#8217;ll port it.</p>
<p>The application in question is a simple tool for cleaning up the export of a Print Publishing CMS system for eventual use in a Web-based CMS. By <em>simple </em>I mean we open a folder and loop through it, diving into sub-folders as needed to:</p>
<ol>
<li>Remove all images tagged with a _bw_</li>
<li>Open XML &#8216;story&#8217; files and remove extra line breaks from headline elements, and clean up content HTML.</li>
</ol>
<p>The application started as an <a title="Apple Xcode" href="http://developer.apple.com/technologies/tools/xcode.html" target="_blank">Apple Xcode</a> project, and has now moved into <a title="Netbeans" href="http://netbeans.org/" target="_blank">NetBeans 6.8</a> on Linux. In the end I hope to learn a good deal about the Qt framework, as well as proper C++ application development.</p>
<p><span id="more-227"></span></p>
<h2>How and why are we doing this?</h2>
<p>Command line apps are only so useful, so the next natural step was to port it to a GUI. I had not done this before, so it would be an education experience. Perhpas you find yourself in a similar situation, stuck with a command line tool when a nice GUI would be preferred. Of course doing so can be intimidating at first, as in most cases the libraries needed to accomplish this task can be quite daunting.</p>
<p>To that end I we&#8217;ll use Qt (read: <em>cute</em>) because it&#8217;s open source for non-commercial  apps, is incredibly powerful, cross-platform, easy to learn, and well documented.</p>
<h2>The Code</h2>
<p>So what have we got to work with? I did a fair bit of experimentation during the first pass, what we see here is the sanitized version with most comments and junk taken out. That said, it should work on *NIX based distributions, Windows is iffy, and not tested.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Clean Up Prestige Export Files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Removes all _bw_ images</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* TODO: Clean up image names (remove non-acceptable characters)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Removes all &lt;br/&gt; and \r \n from headlines</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Transforms body &lt;br/&gt; items into valid p tags</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @author Matthew Grdinic</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @organization Journal Interactive</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @date 5/19/10</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @version 0.2.0008</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* TODO:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;string&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;dirent.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdio.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;fstream&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iterator&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;sys/types.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;sys/stat.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;unistd.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define DEBUG false</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy0">*</span> <span class="kw4">const</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>argc <span class="sy0">!=</span> <span class="nu0">2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">fprintf</span><span class="br0">&#40;</span><span class="kw2">stderr</span>,<span class="st0">&quot;Usage: %s [base xmlout dirname]<span class="es0">\n</span>&quot;</span>,argv<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string br <span class="sy0">=</span> <span class="st0">&quot;&lt;br/&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string rl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string nl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string rn <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string openp <span class="sy0">=</span> <span class="st0">&quot;&lt;p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string closep <span class="sy0">=</span> <span class="st0">&quot;&lt;/p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string doublebr <span class="sy0">=</span> <span class="st0">&quot;&lt;br/&gt;&lt;br/&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;======================&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;WELCOME TO THE CLEANER&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;======================&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// path data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;string basePath <span class="sy0">=</span> argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string imagePath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string storyPath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// images</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;Starting image clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;DIR <span class="sy0">*</span>d;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">struct</span> dirent <span class="sy0">*</span>dir;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string location;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string path;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string replaceString;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;d <span class="sy0">=</span> opendir<span class="br0">&#40;</span>imagePath.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> found;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;found <span class="sy0">=</span> name.<span class="me1">rfind</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>found <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; path <span class="sy0">=</span> imagePath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; location <span class="sy0">=</span> imagePath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">cout</span> &lt;&lt; location &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> t <span class="sy0">=</span> <span class="kw3">remove</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>t <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">cout</span> &lt;&lt; counter &lt;&lt; <span class="st0">&quot; image file(s) were removed.&quot;</span> &lt;&lt; endl &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// xml files</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Starting file clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;d <span class="sy0">=</span> opendir<span class="br0">&#40;</span>storyPath.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// low memory, no parallelization</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;location <span class="sy0">=</span> storyPath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>name <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">&amp;&amp;</span> name <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span> <span class="sy0">&amp;&amp;</span> name <span class="sy0">!=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// ==&gt; buffer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// alternative version of buffer &#8211; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; string fileData2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; string buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;buff <span class="sy0">+=</span> fileData2 <span class="sy0">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fileData <span class="sy0">=</span> buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// == remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;hl1&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;/hl1&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>hl1Start <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> hl1End <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;replaceString <span class="sy0">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1 exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;body.content&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;/body.content&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>bodyStart <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> bodyEnd <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;replaceString <span class="sy0">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw4">int</span> matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; innerp <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rn, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>innerp <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>matchingP <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Hanging p&quot;</span> &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// bodyEnd exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// save file</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location <span class="sy0">+</span> <span class="st0">&quot;-debug.xml&quot;</span><span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ofstream<span class="sy0">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location<span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ofstream<span class="sy0">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; outfile.<span class="me1">write</span><span class="br0">&#40;</span>fileData.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, fileData.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="co1">// while()</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>The Current Program</h2>
<p>The program is broken into several logical sections: The first part of the program takes the user supplied command line argument of a folder and creates a simple variable: <strong>basePath</strong>. This path is then used to build the other locations of our sub-folder structure. Here we also define a few text constants used in the XML file cleanup step.</p>
<p>With a valid path, we loop though the images folder and delete any files with a _bw_ in the name. The _bw_ is for Black and White, and is a known quantity in this work-flow.</p>
<p>I should add at this point the folder structure we are traversing looks like:</p>
<p>xmlout</p>
<p>&#8211;images/</p>
<p>&#8212;-/image_files.jog</p>
<p>&#8211;null/</p>
<p>&#8211;stories/</p>
<p>&#8212;-/story.xml</p>
<p>&#8212;-/story.xml</p>
<p>The next step is slightly longer, here we need to clean up XML files. The process really isn&#8217;t important for the porting process, as we&#8217;ll probably end up with very similar code in the end anyway. The long and short of it though is at several places in the XML output are unclosed &lt;p&gt; tags, extra line breaks and formatting, and other general messiness that cause an XML import of these files to fail when going to the &#8216;target&#8217; system.</p>
<p>The one thing I <em>do</em> want to pay attention to is the file read process. It&#8217;s in this area that we&#8217;ll probably find the most diversion from the command line app. In particular, I want to see how Qt makes file reading easier, and also, I want to explore parallelization at this step. I can envision reading in a batch of files, say, 50 at a time, and then spawning new threads to handle the clean up tasks.</p>
<p>Of course we then write the cleaned up files back to the system, something that again, could probably be done in concert with a parallel processing model.</p>
<p>More generally though, with a port I want to explore a more object oriented way of performing these steps, as well as adding more error and sanity checks.</p>
<h2>Coming In Part 2</h2>
<p>Stay tuned for part 2 where we&#8217;ll take a look at the ported code I&#8217;ve created thus far. We&#8217;ll talk about general Qt development, and what goals I have the project in general.</p>
<h2>Code Download</h2>
<p>A note of caution: This code has not been tested, and may not work on Windows. Of course this is one area a proper Qt port will help with!</p>
<p><a href='http://www.formboss.net/blog/wp-content/uploads/2010/05/main.cpp_.zip'>main.cpp</a><br />
Go To Part 2 &#8211;&gt;<br />
<a href="porting-to-the-qt-c-framework-part-2">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

