{"id":4202,"date":"2021-01-02T09:57:55","date_gmt":"2021-01-02T15:57:55","guid":{"rendered":"https:\/\/www.logikalsolutions.com\/wordpress\/?p=4202"},"modified":"2023-11-27T18:22:46","modified_gmt":"2023-11-28T00:22:46","slug":"so-you-cant-get-your-qt-models-to-work-with-qml","status":"publish","type":"post","link":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/","title":{"rendered":"So You Can&#8217;t Get Your Qt Models to Work With QML?"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This particular rant was started by my looking to divert my mind by answering <a href=\"https:\/\/stackoverflow.com\/questions\/65328173\/how-to-delete-row-from-tableview-properly\/65382947?noredirect=1#comment115713118_65382947\">a question on StackOverflow<\/a>. Never ever ever go to StackOverflow. Kids today just don&#8217;t know squat and there is nothing you can do to help them. Let&#8217;s start with my initial response an a slightly improved image.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1004\" height=\"711\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qml-flow-2.png\" alt=\"\" class=\"wp-image-4201\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qml-flow-2.png 1004w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qml-flow-2-300x212.png 300w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qml-flow-2-768x544.png 768w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qml-flow-2-850x602.png 850w\" sizes=\"(max-width: 1004px) 100vw, 1004px\" \/><figcaption class=\"wp-element-caption\">The gist of the issue<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>QML is just a hand polished turd.<\/strong> There is no polite way to put it. Qt made a desperate ploy to attract script kiddies in the iDiot phone market with QML. The problem is, by and large, script kiddies don&#8217;t know anything. They tend to be &#8220;self-taught&#8221; with far more emphasis on &#8220;self&#8221; than &#8220;taught.&#8221; No grounding in the fundamentals of application design and software development. They just want to hack. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They like scripting languages because you can &#8220;just hack&#8221; without rules. If you want to get an idea for just how much disinformation exists in the script kiddie world, check out the claims about Python being type safe. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hopefully you will all click the link and look at the original question and code. <strong>Please do so now!<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">My Initial Response<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This image may not be 100% accurate but it is how one must visualize things in their mind. You have three distinct lanes an object lives in when you introduce QML: C++, QML Engine, and JavaScript engine. Each and every one of those lanes believes beyond a shadow of a doubt that <strong>they control the life and death of the object<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you are just passing integers around that are passed by value, this is no issue. When you are passing QStrings around, because of the copy-on-write charter of Qt, this is only a minor issue. When you are passing real objects around, worse yet, complex containers of real objects, you have to understand this completely. The answer that &#8220;fixed&#8221; your problem really only masked it. You will find there is a lot of QML and JavaScript code out there that exists only to mask an application not respecting the lanes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Had this application used an actual database there would be a fourth lane. Yes, SQLite provides an SQL interface and allows many things, but an actual database has an external engine providing shared access and controlling the life of cursors. SQLite files tend to be single user. Yes, multiple threads within your application can access it, but while your application is running you cannot open a terminal window and use command line tools to examine the database. Think of it more as a really nice indexed file system without sharing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, you create an object in C++ and then expose it to QML. The QML engine now believes beyond a doubt that it controls the life and death of that object despite not having its own copy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">QML is really feeble. It can&#8217;t actually do much, so it has to hand any significant object off to JavaScript. The JavaScript engine now believes beyond a shadow of a doubt that it now controls the life and death of that object.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You need to also envision these lanes as independent threads. There will most likely be many threads within each, but, in general, any signal or communication between these will go on the event loop of the target <strong>as a queued event<\/strong>. That means it will only be processed when it finally bubbles to the top of the queue for that event loop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This, btw, <strong>is why you can never use Smart Pointers<\/strong> when also using QML\/JavaScript. Especially the kind that do reference counting and delete the object when there are no more references. There is no way for the C++ lane to know that QML or JavaScript are still using the object.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The answer telling you to check for undefined property is masking the problem that your code is drunk driving across all lanes. Eventually, on a faster (or sometimes slower) processor garbage collection for one of the lanes will run at a <em>most<\/em> inopportune moment and you will be greeted with a stack dump. (The drunk driving code will hit a tree that does not yield.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Correct Solution #1:<\/strong> Never use QML or JavaScript. Just use C++ and Widgets. Stay entirely within the C++ lane. If that is a route open to you it&#8217;s a good way to go. There is an awful lot of production code out there doing just that. You can obtain a copy of <a href=\"https:\/\/www.theminimumyouneedtoknow.com\/qt_book.html\">this book<\/a> (or just download the source code from the page) and muddle through building it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Correct Solution #2:<\/strong> <em>Never actually do anything<\/em> in QML or JavaScript. This is an all together different solution than #1. You can use QML <em>for UI only<\/em>, leaving all logic in C++. Your code is failing because you are trying to actually do something. I haven&#8217;t built or tried your code. I simply saw<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"function deleteRowFromDatabase(row)\n\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">deleteRowFromDatabase<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">row<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">which shouldn&#8217;t exist at all. C++ holds your model. You emit a signal from your QML\/JavaScript lanes when user action requires deletion. This signal becomes a queued event in the C++ lane. When it is processed the row will be deleted and the model updated. If you have properly exposed your model to QML it will emit some form of &#8220;model changed&#8221; signal and the UI will update accordingly. One of the main points of MVC (Model-View-Controler) is communication to\/from the model. When the data changes it notifies the view(s).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Correct Solution #3:<\/strong> Never use C++. Have your C++ be a &#8220;Hello World!&#8221; shell that just launches your QML. Never create and share an object between C++ and the other two lanes. Do everything inside of JavaScript and QML.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Binding loop errors, in general, happen when code drunk drives across all three lanes. They also happen when code doesn&#8217;t view each lane as at least one distinct thread with its own event loop. The C++ lane hasn&#8217;t finished (perhaps not even started) the delete operation but your code is already trying to use the result.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Final Solution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lots of back and forth happened. When someone has locked themselves into a failed architecture they are generally the last ones to see the failure of their plan. I know. I&#8217;ve been on the other side of that. You have to be on the other side of that a few times to learn how to avoid it in the future.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>First problem is they chose to use QML.<\/strong> That locked them into using a model. You will find out why that was bad in a bit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Second problem was drunk driving across all of the lanes.<\/strong> When you stay in the green lane, life is good. Theoretically, when you stay in the red lane life is just as good, you simply can&#8217;t do anything real. If you choose to exist only in the yellow lane, then you don&#8217;t need Qt at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Third problem was the fact there was absolutely no reason for a proxy.<\/strong> You are supposed to use a proxy when you need to transform data for display, like formatting a date or populating a combo box of reference table values. Some also use them to ensure a read-only data source cannot accidentally receive a write request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fourth problem was not really knowing anything about a relational database.<\/strong> I see this a lot in the self-taught universe. I even see it with recent college graduates because they can pursue some kind of Web\/Game development degree and nobody thinks to include a course on how to care for and feed a relational database.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Models<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">QML Turd<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">There is just no polite way to describe QML. This forcing of models upon the world would be fine if it was properly architected. Hell, suitable debugging and error information would go a long way.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"QVariant data(const QModelIndex &amp;index, int role) const;\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FFCB6B\">QVariant<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">data<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QModelIndex<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">&amp;<\/span><span style=\"color: #BABED8; font-style: italic\">index<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">role<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #89DDFF\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">That one line causes more problems than anything else. If it doesn&#8217;t <em><strong>exactly<\/strong><\/em> match that in your concrete implementation, you will get no data. The documentation and the IDE will lead many to believe it should have a different signature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Oh, but if it&#8217;s not right it will just give me an error, right?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nope!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are using this model in a table the model will return the row count and your table will be all NULL data. If QML can&#8217;t find this, it won&#8217;t tell you. Adding insult to injury there is not a flag or debugging option you can set to force QML to identify which data() method it used.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, if you have 60 rows in your table the model will tell the UI there are 60 rows and you will have 60 NULL rows and, most likely a scrollbar.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Broken<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">This is where OOP jumped the shark. You can get <a href=\"https:\/\/www.theminimumyouneedtoknow.com\/agile_book.html\">my latest book<\/a> and read about MVVM. I won&#8217;t repeat that essay. What I will tell you is that MVVM was created by people who don&#8217;t know how to use a relational database and are physically incapable of understanding data, without a relation, is useless.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If someone walks into a room and says &#8220;25&#8221; then leaves you have no idea WTF they are talking about. If someone walks into a room and says &#8220;John Smith is 25&#8221; then leaves, you may or may not know who John Smith is, but you now know he is 25. The 25 now has meaning because it has a relation. With the possible exception of NULL, there is no meaning without relation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You need to know the previous information because it provides a frame of reference. People who don&#8217;t know how to properly use relational databases create the models. When they create automated tests for them these tests will be worse than non-existent. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"void SQLiteModel::deleteRow(int rowNo)\n {\n     qDebug() << &quot;removeRow called for &quot; << rowNo << &quot;\\n&quot;;\n     bool rslt = removeRow(rowNo);\n     qDebug() << &quot;result of removeRow() &quot; << rslt << &quot;\\n&quot;;\n     qDebug() << &quot;Error: &quot; << lastError().text() << &quot;\\n&quot;;\n     qDebug() << &quot;query: &quot; << query().lastQuery() << &quot;\\n&quot;;\n     submitAll();\n }\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">void<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">deleteRow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">rowNo<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">     <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">removeRow called for <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> rowNo <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\">\\n<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">     <\/span><span style=\"color: #C792EA\">bool<\/span><span style=\"color: #BABED8\"> rslt <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">removeRow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">rowNo<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">     <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">result of removeRow() <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> rslt <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\">\\n<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">     <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Error: <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">lastError<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">text<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\">\\n<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">     <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">query: <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">query<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">lastQuery<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\">\\n<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">     <\/span><span style=\"color: #82AAFF\">submitAll<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">When the above executes you see the following.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"removeRow called for  3\n result of removeRow()  false\n Error:  &quot;near \\&quot;WHERE\\&quot;: syntax error Unable to execute statement&quot;\n query:  &quot;select * from questions;&quot; \" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BABED8\">removeRow called for  <\/span><span style=\"color: #F78C6C\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> result <\/span><span style=\"color: #89DDFF\">of<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">removeRow<\/span><span style=\"color: #BABED8\">()  <\/span><span style=\"color: #FF9CAC\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Error<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\">  <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">near <\/span><span style=\"color: #BABED8\">\\&quot;<\/span><span style=\"color: #C3E88D\">WHERE<\/span><span style=\"color: #BABED8\">\\&quot;<\/span><span style=\"color: #C3E88D\">: syntax error Unable to execute statement<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">query<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\">  <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">select * from questions;<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">It didn&#8217;t matter if the table was created with this<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"query.exec(&quot;CREATE TABLE IF NOT EXISTS questions (Q_NO INTEGER PRIMARY KEY, Q_TEXT TEXT);&quot;); \" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">exec<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">CREATE TABLE IF NOT EXISTS questions (Q_NO INTEGER PRIMARY KEY, Q_TEXT TEXT);<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">);<\/span><span style=\"color: #BABED8\"> <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">or with this<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"query.exec(&quot;CREATE TABLE IF NOT EXISTS questions (Q_NO INTEGER PRIMARY KEY AUTOINCREMENT, Q_TEXT TEXT NOT NULL);&quot; \" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">exec<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">CREATE TABLE IF NOT EXISTS questions (Q_NO INTEGER PRIMARY KEY AUTOINCREMENT, Q_TEXT TEXT NOT NULL);<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It appears this has <a href=\"https:\/\/forum.qt.io\/topic\/109992\/how-to-remove-row-from-qsqltablemodel\/10\">been broken for over a year<\/a>, if it ever worked at all.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Lack of Formal Training<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Formal training. Actually attending a good school for computer science cannot be overvalued. Sadly there are a lot of run-for-profit shit schools along with just plain shit schools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formal training. That&#8217;s what teaches you to generate large test data sets. Testing with only ten or fewer records won&#8217;t help you find anything. Even for some hokey little program like this you need to initially test with at least enough records to force a scrollbar onto the UI. At least 60 would be good. 500 would be better. There is an <a href=\"https:\/\/loremipsum.io\/\">ipsum generator<\/a> if you really hate typing that much.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formal training. That&#8217;s what teaches you the first step to solving a database table issue of any kind is verifying the creation and population of the table from the command line. If you read through the original code you will see it was just stuffing records into the proxy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formal training. That&#8217;s what teaches you the &#8220;default debugger&#8221; and moving onto other I\/O operations like deleting rows. Other things that can be verified from the command line.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formal training. That is what teaches you proper software development technique. The language and tools you use don&#8217;t matter. Proper technique is what matters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can solve any programming problem with the proper technique formal training provides. That and a formal logic class that teaches no programming language is what one needs to succeed in IT. Tools come and go. Those two things are constants.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Code<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"QT += quick sql\n CONFIG += c++11\n #\n This is important\n #\n CONFIG += qmltypes\n QML_IMPORT_NAME = Fred\n QML_IMPORT_MAJOR_VERSION = 1\n You can make your code fail to compile if it uses deprecated APIs.\n In order to do so, uncomment the following line.\n DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0\n SOURCES += \\\n         main.cpp \\\n         sqlitemodel.cpp\n RESOURCES += qml.qrc\n Additional import path used to resolve QML modules in Qt Creator's code model\n QML_IMPORT_PATH =\n Additional import path used to resolve QML modules just for Qt Quick Designer\n QML_DESIGNER_IMPORT_PATH =\n Default rules for deployment.\n qnx: target.path = \/tmp\/$${TARGET}\/bin\n else: unix:!android: target.path = \/opt\/$${TARGET}\/bin\n !isEmpty(target.path): INSTALLS += target\n HEADERS += \\\n     sqlitemodel.h\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BABED8\">QT <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #BABED8\"> quick sql<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> CONFIG <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #BABED8\"> c++11<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #464B5D; font-style: italic\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> This is important<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #464B5D; font-style: italic\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> CONFIG <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #BABED8\"> qmltypes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> QML_IMPORT_NAME <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> Fred<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> QML_IMPORT_MAJOR_VERSION <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> You can make your code fail to compile if it uses deprecated APIs.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> In order to do so, uncomment the following line.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> DEFINES <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #BABED8\"> QT_DISABLE_DEPRECATED_BEFORE=0x060000    <\/span><span style=\"color: #464B5D; font-style: italic\"># disables all the APIs deprecated before Qt 6.0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> SOURCES <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #BABED8\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">         main.cpp \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">         sqlitemodel.cpp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> RESOURCES <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #BABED8\"> qml.qrc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> Additional import path used to resolve QML modules in Qt Creator&#39;s code model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> QML_IMPORT_PATH <\/span><span style=\"color: #89DDFF\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> Additional import path used to resolve QML modules just for Qt Quick Designer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> QML_DESIGNER_IMPORT_PATH <\/span><span style=\"color: #89DDFF\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> Default rules for deployment.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">qnx<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> target.path = \/tmp\/$${TARGET}\/bin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">else<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> unix:!android: target.path = \/opt\/$${TARGET}\/bin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">!isEmpty(target.path)<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> INSTALLS += target<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> HEADERS <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #BABED8\"> \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">     sqlitemodel.h<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#ifndef SQLITEMODEL_H\n#define SQLITEMODEL_H\n\n#include <QtSql\/QSqlQueryModel&gt;\n\nclass SQLiteModel : public QSqlQueryModel {\nQ_OBJECT\n\npublic:\n    explicit SQLiteModel(QObject *parent = NULL);\n    ~SQLiteModel();\n\n    Q_INVOKABLE bool setQuery(const QString &amp;query);\n\n    virtual QHash<int, QByteArray&gt; roleNames() const;\n\n    QVariant data(const QModelIndex &amp;index, int role) const;\n    static void declareQML();\n\nprivate:\n    bool openDb();\n    QSqlDatabase db;\n\n    int m_recordCount;\n\n};\n\n#endif \/\/ SQLITEMODEL_H\n \" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#ifndef<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">SQLITEMODEL_H<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#define<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">SQLITEMODEL_H<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QtSql\/QSqlQueryModel<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">class<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">public<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">QSqlQueryModel<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">Q_OBJECT<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">public<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #C792EA\">explicit<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">SQLiteModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">QObject<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">*<\/span><span style=\"color: #BABED8; font-style: italic\">parent<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">NULL);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #82AAFF\">~SQLiteModel<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    Q_INVOKABLE <\/span><span style=\"color: #C792EA\">bool<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">setQuery<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #F07178\"> QString <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #F07178\">query<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #C792EA\">virtual<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">QHash<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">QByteArray<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">roleNames<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #FFCB6B\">QVariant<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">data<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">QModelIndex<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">&amp;<\/span><span style=\"color: #BABED8; font-style: italic\">index<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8; font-style: italic\">role<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #C792EA\">static<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #C792EA\">void<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">declareQML<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">private<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #C792EA\">bool<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">openDb<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    QSqlDatabase db<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #F07178\"> m_recordCount<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#endif<\/span><span style=\"color: #464B5D; font-style: italic\"> \/\/ SQLITEMODEL_H<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\"> <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#include &quot;sqlitemodel.h&quot;\n\n#include <QDebug&gt;\n#include <QFileInfo&gt;\n#include <QtSql\/QSqlQuery&gt;\n#include <QtSql\/QSqlError&gt;\n#include <QtSql\/QSqlRecord&gt;\n#include <QtSql\/QSqlDatabase&gt;\n#include <QQmlEngine&gt;\n#include <QDir&gt;\n\n\n\nvoid SQLiteModel::declareQML() {\nqmlRegisterType<SQLiteModel&gt;(&quot;Extensions&quot;, 1, 0, &quot;SQLiteModel&quot;);\n}\n\nSQLiteModel::SQLiteModel(QObject *parent)\n    :QSqlQueryModel(parent)\n{\n    openDb();\n}\n\nSQLiteModel::~SQLiteModel()\n{\n\n}\n\nbool SQLiteModel::openDb()\n{\n    QDir hDir = QDir::home();\n    db = QSqlDatabase::addDatabase(&quot;QSQLITE&quot;);\n    db.setDatabaseName(hDir.absoluteFilePath(&quot;sample.db&quot;));\n    return db.open();\n}\n\nbool SQLiteModel::setQuery(const QString &amp;query)\n{\n    QSqlQueryModel::setQuery(query);\n\n    if (this-&gt;query().record().isEmpty()) {\n        qWarning() << &quot;SQLiteModel::setQuery() -&quot; << this-&gt;query().lastError();\n        return false;\n    }\n    m_recordCount = record().count();\n    qDebug() << &quot;Records: &quot; << m_recordCount;\n\n    return true;\n}\n\nQHash<int, QByteArray&gt; SQLiteModel::roleNames() const\n{\n    qDebug() << &quot;roleNames() called\\n&quot;;\n    QHash<int, QByteArray&gt; roles;\/\/ = QAbstractTableModel::roleNames();\n    for( int i = 0; i < record().count(); i++) {\n        roles[Qt::UserRole + i + 1] = record().fieldName(i).toLatin1();\n    }\n    return roles;\n}\n\nQVariant SQLiteModel::data(const QModelIndex &amp;index, int role) const\n{\n    qDebug() << &quot;data() called\\n&quot;;\n    QVariant value = QSqlQueryModel::data(index, role);\n    if(role < Qt::UserRole)\n    {\n        value = QSqlQueryModel::data(index, role);\n    }\n    else\n    {\n        int columnIdx = role - Qt::UserRole - 1;\n        QModelIndex modelIndex = this-&gt;index(index.row(), columnIdx);\n        value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);\n    }\n\n    qDebug() << &quot;data() returning: &quot; << value << &quot;\\n&quot;;\n    return value;\n}\n\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">sqlitemodel.h<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QDebug<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QFileInfo<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QtSql\/QSqlQuery<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QtSql\/QSqlError<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QtSql\/QSqlRecord<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QtSql\/QSqlDatabase<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QQmlEngine<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QDir<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">void<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">declareQML<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">qmlRegisterType<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">&gt;(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Extensions<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">SQLiteModel<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">SQLiteModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">QObject <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #BABED8\">parent<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    :<\/span><span style=\"color: #82AAFF\">QSqlQueryModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">parent<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #82AAFF\">openDb<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::~<\/span><span style=\"color: #82AAFF\">SQLiteModel<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">bool<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">openDb<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    QDir hDir <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QDir<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">home<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    db <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QSqlDatabase<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">addDatabase<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">QSQLITE<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    db<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">setDatabaseName<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">hDir<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">absoluteFilePath<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">sample.db<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #BABED8\"> db<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">open<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">bool<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">setQuery<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QString<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">&amp;<\/span><span style=\"color: #BABED8; font-style: italic\">query<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #FFCB6B\">QSqlQueryModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">setQuery<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">query<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">(this-&gt;<\/span><span style=\"color: #82AAFF\">query<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">record<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">isEmpty<\/span><span style=\"color: #89DDFF\">())<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #82AAFF\">qWarning<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">SQLiteModel::setQuery() -<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">this-&gt;<\/span><span style=\"color: #82AAFF\">query<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">lastError<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">false;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    m_recordCount <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">record<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">count<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Records: <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> m_recordCount<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">true;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">QHash<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QByteArray<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">roleNames<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">const<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">roleNames() called<\/span><span style=\"color: #BABED8\">\\n<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    QHash<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> QByteArray<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\"> roles<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #464B5D; font-style: italic\">\/\/ = QAbstractTableModel::roleNames();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #BABED8\"> i <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> i <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">record<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">count<\/span><span style=\"color: #89DDFF\">();<\/span><span style=\"color: #BABED8\"> i<\/span><span style=\"color: #89DDFF\">++)<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #BABED8\">roles<\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #FFCB6B\">Qt<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #F07178\">UserRole <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #F07178\"> i <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">]<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">record<\/span><span style=\"color: #89DDFF\">().<\/span><span style=\"color: #82AAFF\">fieldName<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F07178\">i<\/span><span style=\"color: #89DDFF\">).<\/span><span style=\"color: #82AAFF\">toLatin1<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #BABED8\"> roles<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">QVariant<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">data<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QModelIndex<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">&amp;<\/span><span style=\"color: #BABED8; font-style: italic\">index<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">role<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">const<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">data() called<\/span><span style=\"color: #BABED8\">\\n<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    QVariant value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QSqlQueryModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">data<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">index<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> role<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">role <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Qt<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #BABED8\">UserRole<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">QSqlQueryModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">data<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F07178\">index<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> role<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #F07178\"> columnIdx <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> role <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">Qt<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #F07178\">UserRole <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        QModelIndex modelIndex <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">this-&gt;<\/span><span style=\"color: #82AAFF\">index<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">index<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">row<\/span><span style=\"color: #89DDFF\">(),<\/span><span style=\"color: #F07178\"> columnIdx<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">QSqlQueryModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">data<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F07178\">modelIndex<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #FFCB6B\">Qt<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #F07178\">DisplayRole<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #82AAFF\">qDebug<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">data() returning: <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> value <\/span><span style=\"color: #89DDFF\">&lt;&lt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\">\\n<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #BABED8\"> value<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#include <QGuiApplication&gt;\n#include <QQmlApplicationEngine&gt;\n#include <QQmlContext&gt;\n\n#include &quot;sqlitemodel.h&quot;\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\n\n    QGuiApplication app(argc, argv);\n\n    SQLiteModel::declareQML();\n\n    QQmlApplicationEngine engine;\n    const QUrl url(QStringLiteral(&quot;qrc:\/main.qml&quot;));\n    QObject::connect(&amp;engine, &amp;QQmlApplicationEngine::objectCreated,\n                     &amp;app, [url](QObject *obj, const QUrl &amp;objUrl) {\n        if (!obj &amp;&amp; url == objUrl)\n            QCoreApplication::exit(-1);\n    }, Qt::QueuedConnection);\n\n    SQLiteModel *sqmodel = new SQLiteModel(nullptr);\n    sqmodel-&gt;setQuery(&quot;select * from sample;&quot;);\n\n    engine.rootContext()-&gt;setContextProperty(&quot;tableModel&quot;,sqmodel);\n    engine.load(QUrl(QStringLiteral(&quot;qrc:\/main.qml&quot;)));\n\n    return app.exec();\n}\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QGuiApplication<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QQmlApplicationEngine<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">QQmlContext<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">#include<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">sqlitemodel.h<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">int<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">main<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">int<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #BABED8; font-style: italic\">argc<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">char<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">*<\/span><span style=\"color: #BABED8; font-style: italic\">argv<\/span><span style=\"color: #89DDFF\">[])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #FFCB6B\">QCoreApplication<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">setAttribute<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Qt<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #BABED8\">AA_EnableHighDpiScaling<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    QGuiApplication <\/span><span style=\"color: #82AAFF\">app<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8\">argc<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> argv<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #FFCB6B\">SQLiteModel<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">declareQML<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    QQmlApplicationEngine engine<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> QUrl <\/span><span style=\"color: #82AAFF\">url<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">QStringLiteral<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">qrc:\/main.qml<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #FFCB6B\">QObject<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">connect<\/span><span style=\"color: #89DDFF\">(&amp;<\/span><span style=\"color: #BABED8\">engine<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #FFCB6B\">QQmlApplicationEngine<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #BABED8\">objectCreated<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">                     <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #BABED8\">app<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #BABED8; font-style: italic\">url<\/span><span style=\"color: #89DDFF\">](<\/span><span style=\"color: #FFCB6B\">QObject<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">*<\/span><span style=\"color: #BABED8; font-style: italic\">obj<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">QUrl<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">&amp;<\/span><span style=\"color: #BABED8; font-style: italic\">objUrl<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">(!<\/span><span style=\"color: #BABED8\">obj <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #BABED8\"> url <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #BABED8\"> objUrl<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">            <\/span><span style=\"color: #FFCB6B\">QCoreApplication<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #82AAFF\">exit<\/span><span style=\"color: #89DDFF\">(-<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">},<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Qt<\/span><span style=\"color: #89DDFF\">::<\/span><span style=\"color: #BABED8\">QueuedConnection<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    SQLiteModel <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #BABED8\">sqmodel <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">new<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">SQLiteModel<\/span><span style=\"color: #89DDFF\">(nullptr);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    sqmodel<\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #82AAFF\">setQuery<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">select * from sample;<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    engine<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">rootContext<\/span><span style=\"color: #89DDFF\">()-&gt;<\/span><span style=\"color: #82AAFF\">setContextProperty<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">tableModel<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\">sqmodel<\/span><span style=\"color: #89DDFF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    engine<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">load<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">QUrl<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">QStringLiteral<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">qrc:\/main.qml<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #BABED8\"> app<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">exec<\/span><span style=\"color: #89DDFF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import QtQuick 2.15\nimport QtQuick.Window 2.15\nimport QtQuick.Controls 1.4\n\nApplicationWindow {\ntitle: qsTr(&quot;SQL Demo&quot;)\nwidth: 640\nheight: 480\nvisible: true\n\nminimumWidth: 640\nminimumHeight: 480\n\n\n    TableView {\n        anchors.fill: parent\n        model: tableModel\n        TableViewColumn{ role: &quot;name&quot;  ; title: &quot;Name&quot; ; width: 100 }\n        TableViewColumn{ role: &quot;age&quot;  ; title: &quot;Age&quot; ; width: 100 }\n        TableViewColumn{ role: &quot;gender&quot; ; title: &quot;Gender&quot; ; width: 100 }\n    }\n} \" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #BABED8\"> QtQuick 2.15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">import QtQuick.Window 2.15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">import QtQuick.Controls 1.4<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">ApplicationWindow <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">title<\/span><span style=\"color: #F07178\">: <\/span><span style=\"color: #BABED8\">qsTr<\/span><span style=\"color: #F07178\">(&quot;<\/span><span style=\"color: #BABED8\">SQL<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">Demo<\/span><span style=\"color: #F07178\">&quot;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">width<\/span><span style=\"color: #F07178\">: 640<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">height<\/span><span style=\"color: #F07178\">: 480<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">visible<\/span><span style=\"color: #F07178\">: <\/span><span style=\"color: #BABED8\">true<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">minimumWidth<\/span><span style=\"color: #F07178\">: 640<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">minimumHeight<\/span><span style=\"color: #F07178\">: 480<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">TableView<\/span><span style=\"color: #F07178\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #BABED8\">anchors<\/span><span style=\"color: #F07178\">.<\/span><span style=\"color: #BABED8\">fill<\/span><span style=\"color: #F07178\">: <\/span><span style=\"color: #BABED8\">parent<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #BABED8\">model<\/span><span style=\"color: #F07178\">: <\/span><span style=\"color: #BABED8\">tableModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #BABED8\">TableViewColumn<\/span><span style=\"color: #F07178\">{ <\/span><span style=\"color: #BABED8\">role<\/span><span style=\"color: #F07178\">: &quot;<\/span><span style=\"color: #BABED8\">name<\/span><span style=\"color: #F07178\">&quot;  ; <\/span><span style=\"color: #BABED8\">title<\/span><span style=\"color: #F07178\">: &quot;<\/span><span style=\"color: #BABED8\">Name<\/span><span style=\"color: #F07178\">&quot; ; <\/span><span style=\"color: #BABED8\">width<\/span><span style=\"color: #F07178\">: 100 <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        TableViewColumn<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">role<\/span><span style=\"color: #F07178\">: &quot;<\/span><span style=\"color: #BABED8\">age<\/span><span style=\"color: #F07178\">&quot;  ; <\/span><span style=\"color: #BABED8\">title<\/span><span style=\"color: #F07178\">: &quot;<\/span><span style=\"color: #BABED8\">Age<\/span><span style=\"color: #F07178\">&quot; ; <\/span><span style=\"color: #BABED8\">width<\/span><span style=\"color: #F07178\">: 100 <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">        TableViewColumn<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">role<\/span><span style=\"color: #F07178\">: &quot;<\/span><span style=\"color: #BABED8\">gender<\/span><span style=\"color: #F07178\">&quot; ; <\/span><span style=\"color: #BABED8\">title<\/span><span style=\"color: #F07178\">: &quot;<\/span><span style=\"color: #BABED8\">Gender<\/span><span style=\"color: #F07178\">&quot; ; <\/span><span style=\"color: #BABED8\">width<\/span><span style=\"color: #F07178\">: 100 <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">} <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Commentary<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Too many of you will take this code and paste it into your own projects without even looking at it. <strong>You really need to read the comments found in sqlitemodel.cpp at lines 150 through 194<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I didn&#8217;t know the models were this busted because I never use them. I only use QML at gunpoint and even then I have to think about it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The models are a failed architecture because they must run in the main event loop.<\/strong> Never do significant I\/O in the main event loop. Yeah, this works nice with a few dozen records. Probably work nice with a few thousand on a fast machine that has plenty of RAM for disk caching and no other users needing to do I\/O.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your database is accross the Internet where you could have upwards of 20 second network timeouts your UI is locked up for that entire time. If your source data is stored on something like an <a href=\"http:\/\/www.columbia.edu\/cu\/computinghistory\/datacell.html\">IBM Data Cell<\/a>;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/external-content.duckduckgo.com\/iu\/?u=http%3A%2F%2Fwww.columbia.edu%2Fcu%2Fcomputinghistory%2Fibmdatacellcolor.jpg&amp;f=1&amp;nofb=1&amp;ipt=62deee34bb48be97d658f3ab9da64cfd52b71e6d91fab2eca5a11081f1963644&amp;ipo=images\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Or its modern day replacement, the tape library<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Massdata Tape Library Robot\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/RfO6EkoRxjA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">Tape library robot in action<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">your UI could be locked up for over half an hour waiting its turn in the I\/O request queue. You don&#8217;t know the definition of &#8220;Big Data&#8221; until you are writing applications designed to use <em>that<\/em> amount of data. Despite what you may think, there are a lot of these still around. <a href=\"https:\/\/its.unc.edu\/2019\/02\/tape-robot\/\">Chapel Hill didn&#8217;t retire Roberta until 2019<\/a>. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/its.unc.edu\/wp-content\/uploads\/sites\/337\/2019\/02\/Tape-Robot-20192.1sm-e1551289308662.jpeg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Roberta at Chapel Hill<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The &#8220;Data Appliance&#8221; which replaced Roberta isn&#8217;t going to be oceans faster. Faster, yes. Oceans faster, not really. Has to do with the compressing and de-duplicating. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a tape robot library that <a href=\"https:\/\/spectralogic.com\/2019\/04\/18\/tape-robot-provides-data-storage-solutions-for-the-next-decade\/\">just got installed in 2019<\/a>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The extra capacity needed to be at least 60 petabytes (PB) \u2013 the equivalent of storing more than 10 million DVDs \u2013 with the potential to increase again to meet future data demands.<\/p>\n<cite>From the above link<\/cite><\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.theminimumyouneedtoknow.com\/book_covers\/Qt-and-DB-clear.jpeg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">The Minimum You Need to Know About Qt and Databases<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>This particular rant was started by my looking to divert my mind by answering a question on StackOverflow. Never ever ever go to StackOverflow. Kids today just don&#8217;t know squat and there is nothing you can do to help them. Let&#8217;s start with my initial response an a slightly improved image. QML is just a hand polished turd. There is no polite way to put it. Qt made a desperate ploy to attract script kiddies &hellip; <a title=\"So You Can&#8217;t Get Your Qt Models to Work With QML?\" class=\"bnm-read-more\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/\"><span class=\"screen-reader-text\">So You Can&#8217;t Get Your Qt Models to Work With QML?<\/span>Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":4207,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[1504,1896,1723,1895,1894,1198,1897,159],"class_list":["post-4202","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-c","tag-ipsum-generator","tag-javascript","tag-models","tag-python","tag-qml","tag-qsqltablemodel","tag-qt","bnm-entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>So You Can&#039;t Get Your Qt Models to Work With QML? &#8211; Logikal Blog<\/title>\n<meta name=\"description\" content=\"An informative rant about the hand polished turd that is QML and getting it to &quot;work&quot; with relational models.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"So You Can&#039;t Get Your Qt Models to Work With QML? &#8211; Logikal Blog\" \/>\n<meta property=\"og:description\" content=\"An informative rant about the hand polished turd that is QML and getting it to &quot;work&quot; with relational models.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/\" \/>\n<meta property=\"og:site_name\" content=\"Logikal Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-02T15:57:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-28T00:22:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qt-qml-sql.png\" \/>\n\t<meta property=\"og:image:width\" content=\"643\" \/>\n\t<meta property=\"og:image:height\" content=\"509\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"seasoned_geek\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"seasoned_geek\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/\"},\"author\":{\"name\":\"seasoned_geek\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"headline\":\"So You Can&#8217;t Get Your Qt Models to Work With QML?\",\"datePublished\":\"2021-01-02T15:57:55+00:00\",\"dateModified\":\"2023-11-28T00:22:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/\"},\"wordCount\":2245,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/qt-qml-sql.png\",\"keywords\":[\"C++\",\"ipsum generator\",\"JavaScript\",\"models\",\"Python\",\"QML\",\"QSqlTableModel\",\"Qt\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/\",\"name\":\"So You Can't Get Your Qt Models to Work With QML? &#8211; Logikal Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/qt-qml-sql.png\",\"datePublished\":\"2021-01-02T15:57:55+00:00\",\"dateModified\":\"2023-11-28T00:22:46+00:00\",\"description\":\"An informative rant about the hand polished turd that is QML and getting it to \\\"work\\\" with relational models.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/qt-qml-sql.png\",\"contentUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/qt-qml-sql.png\",\"width\":643,\"height\":509},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/so-you-cant-get-your-qt-models-to-work-with-qml\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"So You Can&#8217;t Get Your Qt Models to Work With QML?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\",\"name\":\"Logikal Blog\",\"description\":\"For people with attention spans longer than a Tweet\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\",\"name\":\"seasoned_geek\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"caption\":\"seasoned_geek\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\"},\"description\":\"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\\\/Qt touchscreen\\\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \\\"Zinc It!\\\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \\\"The Minimum You Need to Know to Be an OpenVMS Application Developer\\\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \\\"The Minimum You Need to Know\\\" book series was born. Three years later he wrote his first novel \\\"Infinite Exposure\\\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \\\"The Earth That Was\\\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.\",\"sameAs\":[\"https:\\\/\\\/theminimumyouneedtoknow.com\"],\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/author\\\/seasoned_geek\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"So You Can't Get Your Qt Models to Work With QML? &#8211; Logikal Blog","description":"An informative rant about the hand polished turd that is QML and getting it to \"work\" with relational models.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/","og_locale":"en_US","og_type":"article","og_title":"So You Can't Get Your Qt Models to Work With QML? &#8211; Logikal Blog","og_description":"An informative rant about the hand polished turd that is QML and getting it to \"work\" with relational models.","og_url":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/","og_site_name":"Logikal Blog","article_published_time":"2021-01-02T15:57:55+00:00","article_modified_time":"2023-11-28T00:22:46+00:00","og_image":[{"width":643,"height":509,"url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qt-qml-sql.png","type":"image\/png"}],"author":"seasoned_geek","twitter_card":"summary_large_image","twitter_misc":{"Written by":"seasoned_geek","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#article","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/"},"author":{"name":"seasoned_geek","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"headline":"So You Can&#8217;t Get Your Qt Models to Work With QML?","datePublished":"2021-01-02T15:57:55+00:00","dateModified":"2023-11-28T00:22:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/"},"wordCount":2245,"commentCount":0,"publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qt-qml-sql.png","keywords":["C++","ipsum generator","JavaScript","models","Python","QML","QSqlTableModel","Qt"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/","url":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/","name":"So You Can't Get Your Qt Models to Work With QML? &#8211; Logikal Blog","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#primaryimage"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qt-qml-sql.png","datePublished":"2021-01-02T15:57:55+00:00","dateModified":"2023-11-28T00:22:46+00:00","description":"An informative rant about the hand polished turd that is QML and getting it to \"work\" with relational models.","breadcrumb":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#primaryimage","url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qt-qml-sql.png","contentUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2021\/01\/qt-qml-sql.png","width":643,"height":509},{"@type":"BreadcrumbList","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/so-you-cant-get-your-qt-models-to-work-with-qml\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.logikalsolutions.com\/wordpress\/"},{"@type":"ListItem","position":2,"name":"So You Can&#8217;t Get Your Qt Models to Work With QML?"}]},{"@type":"WebSite","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website","url":"https:\/\/www.logikalsolutions.com\/wordpress\/","name":"Logikal Blog","description":"For people with attention spans longer than a Tweet","publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.logikalsolutions.com\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842","name":"seasoned_geek","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","url":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","caption":"seasoned_geek"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r"},"description":"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\/Qt touchscreen\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \"Zinc It!\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \"The Minimum You Need to Know to Be an OpenVMS Application Developer\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \"The Minimum You Need to Know\" book series was born. Three years later he wrote his first novel \"Infinite Exposure\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \"The Earth That Was\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.","sameAs":["https:\/\/theminimumyouneedtoknow.com"],"url":"https:\/\/www.logikalsolutions.com\/wordpress\/author\/seasoned_geek\/"}]}},"_links":{"self":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/4202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/comments?post=4202"}],"version-history":[{"count":0,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/4202\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media\/4207"}],"wp:attachment":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media?parent=4202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/categories?post=4202"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/tags?post=4202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}