問題タブ [qsqltablemodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - QSqlRelationalTableModel の再実装 - コードではなく文字列を返すデータ関数
QSqlRelationalTableModel をサブクラス化しています。
上記のすべてがスペースを出力します (正しい量の行を返しますが、空白としてのみ)。データ関数を削除すると、#1 & #4 が印刷されます。return "string" を実行すると、すべてのアイテムが入力されます。モデルがインスタンス化され、意図した戻りコードがモデルの定義の外で機能します。他の複数の SQL テーブルをすべてリレーションで試してみましたが、リレーションがなくても機能しません。何が問題なのか誰にもわかりますか?
python - PyQt コードの分割 - 参照またはインポートによるメイン アプリの受け渡し
PyQt コードを分割するのに非常に問題があります:
main.py
titles.py
main.py を実行すると、すべてのデータが読み込まれます。QPushButton は行を挿入しますが、"a" がグローバルに定義されていないため、lineEdit を "Insert Title" に設定しません。ほとんどの場合、main.py の読み込み時にトリガーされる titles.py で関数を作成しようとしましたが、次のようになります。
これはデータと関数をロードしますが、insertRow は lineEdit を更新しません。
その他の試みは、Songs クラスを次のように変更します。
...そして、モデル定義の下から titles=Titles() を削除します。これもデータを表示しますが、「追加」を押しても lineEdit は更新されません。
最終的には、titles.py には「from main import *」が必要だと思われますが、メイン アプリケーションのインスタンスは titles.py が呼び出された後に定義され、main.Main をインポートすると再帰が作成されます。「from main import Main」を介して複数回継承し、「class Songs(Main)」を記述しようとしましたが (これにより、Songs は参照を渡さずに UI を使用できます)、再帰が発生します。今日の 9 時間と、他の人を見る前の 3 週間ということで、本当に困惑しています。' builtin 'の構成ファイルを使用することを推奨する人もいますが、それは非常に悪いようです。
よろしく
c++ - QTableView はリリース モードでデータベースを表示しません
C++
inを使用Qt 4.8
してアプリケーションを作成し、 sVisual Studio 2010
で作成しようとしています。すべてうまくいっているように見えますが、.exe
dll
VS または Qt がインストールされていない別のコンピューターでプログラムを実行すると、何も表示されません。
// データベースを作成するクラス
// そのデータベースが表示される QTableView を保持するウィジェット
通常の表示: (私のコンピューター上)
通常のビューではありません (他人のコンピューター上)
dll
フォルダー内
のs:
qt - QSqlRelationalTableModel - 256 より大きいレコードを挿入する
SQLite データベースにテーブルノード={id,name} とテーブルセグメント={id,nodeFrom,nodeTo} があり、node.id と segment.id は AUTOINCREMENT フィールドです。
次のように、ノード用の QSqlTableModel を作成しています。
ノードを挿入するために次のコードを使用します。
これはうまくいくようです。ここで、セグメントに対して、次のように QSqlRelationalTableModel を定義します。
そして、セグメントを挿入するための次のコードがあります。
addNode() を使用して、280 個のノードを正常に追加できます。nodeFrom<=256 および nodeTo<=256 の場合、セグメントを正常に追加することもできます。256 以上のノードを参照するセグメントについて、
addSegment 関数の (*) でマークされた行の 1 つ。
私がググったところ、魔法の 256 レコード数に達したときに、人々が他の (明らかに無関係な) 問題を抱えていることがわかりました。この特定の問題では解決策がないようです。
私は何を間違っていますか?
ありがとう!
qt - Qt 5.3.1 で QSqlTableModel および QSortFilterProxyModel に関する問題が発生しました
多くのデータ モデルに QSortFilterProxyModel を使用していますが、問題なく動作しました。Qt5.3.0 から Qt5.3.1 に更新した後、これは部分的に変更されました。
私の GUI パネルの 1 つは、QSqlTableModel に接続された QSortFilterProxyModel に接続された QTreeView を使用します。SQL モデルは、約 60000 行と 6 つの共通列を持つデータベース テーブルに割り当てられます。
Qt5.3.0 を使用すると、データの読み込みは簡単でした。データを読み込むのに数秒かかり (ネットワーク トラフィック モニターとしてタスク マネージャーを使用)、QTreeView にデータを表示するのにさらに 1 秒かかりました。
苦労したQt5.3.1を使用しています...データをロードするにはまだ数秒かかりますが、データが最終的にビューに表示される前に、CPUコア全体が数分間ブロックされます(アプリケーションが応答しなくなります)。
この問題は、同様の行数を持つカスタム モデル (抽象テーブル モデルから派生) を使用すると発生しません。
また、プレーンな QSqlTableModel とデフォルトで構築された QSortFilterProxyModel (つまり、フィルタリングがまったく行われないことを意味します) で同じことを試しました...まだ読み込みに数分かかります。これは私が使用するコードです:
私は2つの回避策を見つけました。ただし、プロキシ モデルを使用して現在行っていることを行うには十分強力ではありません。
- QSqlTableModel の並べ替えとフィルタリング (WHERE および ORDER BY ベース) を使用します。
- 並べ替えを無効にする
setSortingEnabled(false);
誰かが問題を知っていますか?より良い回避策はありますか?
qt - rowCount() が機能するために SQLite データベースで QSqlTableModel で fetchMore() を使用するタイミングと方法は?
私のクラス DataTable は QAbstractTableModel から派生しています。QSqlTableModel オブジェクトを内部で使用して、db テーブルからデータをフェッチします。これは、データベース内のすべての行のレコードを表します (より多くのことを行いますが、レコード数は常に db テーブル内の行数です)。
MySql では、私の DataTable::rowCount() 実装は QSqlTableModel で rowCount() を呼び出すだけで、うまく機能します。
SQLite を使用すると、db テーブルに 256 行を超える行がある場合、Qt の SQLite ドライバーは行数 256 を返すため、DataTable クラスも 256 を返しますが、これは間違っています。ドキュメントには、に電話するように指示されていますwhile (sql_model->canFetchMore()) sql_model->fetchMore();
。内部 QSqlTableModel が作成された直後に fetchMore() を呼び出すと、実際には次の rowCount() 呼び出しで正しい値が返されます。しかし、データベースで何かが変更されると (私のクラスは QSqlTableModel で insertRow() または setData() を呼び出します)、次の QSqlTableModel::rowCount() 呼び出しは再び 256 を返します。
データベースは、特定の QSqlTableModel オブジェクトを使用するクラスによってのみ変更されます (または、DataTable をモデルとして使用するビューが何かを更新する可能性があります)。したがって、データベースに行を挿入できる他のプロセスはありません。
では、いつ DataTable クラスが fetchMore() を呼び出して、rowCount() が常に実際の行数を返すようにすべきでしょうか?
私のクラスは、QSqlTableModel によって発行されたシグナルの一部を fetchMore() を呼び出すスロットに接続する必要があると考えていますが、それが適切で信頼できる方法であるかどうかはわかりません。
更新:
基本的な問題を示すコードを次に示します。
SQL モデルをロードした後、rowCount() は 256 (1) を返すため、fetchMore() を呼び出す必要があります。その後、rowCount() は実際の行数を返します。
その後、データが変更され、その後、rowCount() は再び 256 (3) を返します。
そのため、sql モデルに対するすべての書き込み操作の後に fetchMore() を呼び出す必要があるようです。しかし、この while/canFetchMore()/fetchMore() ループをモデルを変更するすべてのメソッドの最後に置くのではなく、beforeInsert(QSqlRecord&)、beforeUpdate(int, QSqlRecord&) を接続するだけで十分かどうか疑問に思っています。 beforeDelete(int) は、fetchAll()? を呼び出すスロットに通知しますか? これは信頼でき、適切でしょうか?
訂正: before* シグナルではなく (時期尚早)、おそらく layoutChanged()、dataChanged()、rowsInserted()、rowsRemoved()。
更新 2 :
SQL に関する注意: 理論的には別の SQL クエリをデータベースに送信できることはわかっていSELECT COUNT
ますが、これは質問の答えにはなりません。SQL を避けることができる限り、SQL は書きません。私の考えでは、このような SQL クエリを送信することは、オブジェクト指向の QAbstractTableModel クラスの目的に反しています。さらに、rowCount() は const (クエリを送信しないでください) であり、高速である必要があります。とにかく、これはrowCount()を修正しません。
fetchMore() を呼び出すスロットを関連するシグナル (上記参照) に接続し、 rowCount () ですべてがフェッチされたことをアサートすることになりました。
assert(!sql_model->canFetchMore())
これは、rowCount() が正しい行数カウントを失敗状態として報告できないためです。したがって、アサーションです。つまり、間違った行数を使用するよりも、アプリケーションをクラッシュさせたいと考えています。
それを dataChanged() シグナルに接続するだけでは(最初の回答で提案されているように: I would probably try to use dataChanged signal.
)十分ではありません。dataChanged(const QModelIndex&, const QModelIndex&)
、rowsInserted(const QModelIndex&, int, int)
、rowsRemoved(const QModelIndex&, int, int)
およびに接続しましたlayoutChanged()
。
動作しているように見えますが、アサーションはまだ失敗していません。
誰かがこれを明確に確認できる場合 (または、常に機能するとは限らない理由を説明する場合)、回答をいただければ幸いです。
c++ - QSqlTableModel で特定の列を編集するにはどうすればよいですか
データベースからテーブルを取り出して表示したいが、関数に基づいて特定の列を変更したい
しかし、暗号化されたアイテムを印刷する代わりに、復号化して表示したいのですが、どうすればよいですか?