Qt 4.8の退屈な導入
最近、同僚がQtレポートの使用経験について質問しました(Qtで記述されたSCADAを徐々に実装し始めています)-タスクのため、それは非常に必要なことです。 (このプラットフォームで)ジェネレーターを使用した人はいませんでしたが、FastReportを使用して不要なアプリケーションをドラッグアウトせずに、何らかの形でレポートを使用しました。
プロジェクトを調べてみると、レポート、プレビュー用のウィジェット(QLabel、QTableView ....)を備えたアプリケーションが見つかりました。 レポートの種類「プレビュー」:
下のアプリケーションウィンドウ。 Qt 5.xでは、アプリケーション自体に処理が必要ですが、レポートは機能します。
レポートは、アプリケーションをコンパイルする前にのみ設計されました-すぐに実行するタスクがありました(xmlを使用-作業経験がほとんどありません)。
レポータークラス-レポートジェネレーター
Qtのフォーマットについて読んだ後、Reporterクラスが生まれました(QTextDocument、QTextCursor、およびそれらを操作するためのメソッドが含まれています)。 Reporter内のすべての作業は、QTextDocumentを作成し、プリンターで印刷するか、QWidgetで表示することです。
ドキュメントヘッダーの場合:
- setDateDoc()-時間
- setCompanyDoc()-組織
- setCaptionDoc()-名前
コンテンツの場合:
- setDataHeader(QStringList strLst)-テーブルヘッダー
- addData(QStringList strLst)-データ
作業はQTextBlockFormatまたはQTextTableFormatのプライベートセクションの文字で実行されます
private: int m_iCntTbls; int m_iColCnt; QTextDocument *const m_document; QTextCursor m_cursor;
タイトルが必要-問題ありません
void Reporter::setCompanyDoc(QString str){ // - m_cursor.movePosition(QTextCursor::End); if(m_iCntTbls>0){ m_cursor.insertBlock(); m_cursor.insertBlock(); m_cursor.movePosition(QTextCursor::End); } // QTextBlockFormat blockFrm; blockFrm.setTopMargin(5); blockFrm.setBottomMargin(5); blockFrm.setAlignment(Qt::AlignLeft); blockFrm.setBackground(QBrush(QColor("lightGray"))); // m_cursor.insertBlock(blockFrm); m_cursor.insertText(str); }
同様に、テーブルの日付とタイトルを使用します。
テーブル自体を作成するには、最初にsetDataHeader(QStrignList strLst)メソッドを呼び出す必要があります。列の数はリスト内の行の数と等しくなります。
void Reporter::setDataHeader(QStringList strLst){ // - m_cursor.movePosition(QTextCursor::End); if(m_iCntTbls>0){ m_cursor.insertBlock(); m_cursor.insertBlock(); m_cursor.movePosition(QTextCursor::End); } // QBrush borderBrush(Qt::SolidPattern); // QTextTableFormat tableFormat; tableFormat.setCellPadding(5); tableFormat.setCellSpacing(0); tableFormat.setHeaderRowCount(1); tableFormat.setBorderBrush(borderBrush); tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Ridge); tableFormat.setBorder(1); tableFormat.setWidth(QTextLength(QTextLength::PercentageLength,100)); // m_cursor.insertTable(1,strLst.count(),tableFormat); foreach(QString str, strLst){ m_cursor.insertText(str); m_cursor.movePosition(QTextCursor::NextCell); } m_iCntTbls++; m_iColCnt=strLst.count(); }
最後に、少なくとも1つのテーブルがあることを忘れずに列の数を修正することを忘れないでください。 次に、データを入力します。
void Reporter::addData(QStringList strLst){ // , if(strLst.count()<m_iColCnt){ int iAdd=m_iColCnt-strLst.count(); while(iAdd>0){ iAdd--; strLst<<""; } }else // - if(strLst.count()>m_iColCnt){ QMessageBox::critical(0, tr("AddData"), tr("Too many elements to paste wait %1 got %2").arg(m_iColCnt).arg(strLst.count()), QMessageBox::Ok,QMessageBox::Ok ); return; } // QTextTable *tbl=m_cursor.currentTable(); tbl->appendRows(1); m_cursor.movePosition(QTextCursor::PreviousRow); foreach(QString str, strLst){ m_cursor.movePosition(QTextCursor::NextCell); m_cursor.insertText(str); } }
実際の例:
クラスを取得し、オブジェクト( m_reporter )を作成して、データをプッシュします。
m_reporter->setCompanyDoc(QString::fromLocal8Bit(" ")); m_reporter->setCaptionDoc(QString::fromLocal8Bit(" №0")); strLst<<QString::fromLocal8Bit(" ")<<setStr(" ")<<setStr(" ")<<setStr(" ") <<setStr(" .")<<setStr(" .")<<setStr(""); .....
次のようなものが得られます。
(QDialogで推定)
QPainter painter(this); QRect rec(0,0,this->width(),this->height()); m_reporter->getTextDoc()->drawContents(&painter,rec);
印刷するには、Reporter :: printDoc(QPrinter)メソッドを呼び出す必要があります。
まとめ
特定の問題を迅速に解決するには、標準のQtツールが適しています。このツールから適切なツールを構築できますが、この方法は高品質の製品を提供するためには適用できません。
主な欠点は、ドキュメントの形式を変更するとき、新しいレポートを追加するときなど、レポートを含むプロジェクトをコンパイルする必要があることです。 読んでくれてありがとう。
PS github.com/AlexisVaBel/QtReport.git (プレイする必要があるすべて)。