ユーザーが webapp のさまざまな場所でレポートを作成できる Django アプリがあります。少し気の利いた機能として、これらのレポートの「PDF として送信」機能を作成したいと考えています。
私がしていることは、レポートが Django を介して HttpResponse として返される前に、小さな PySide/QT スニペットを介して生の HTML コンテンツを送信することです (以下を参照)。
問題は、QApplication を終了できないことです。
私は標準で試しましたQCoreApplication.exit()
が、うまくいきませんでした。最初のレポートの直後に新しいレポートを変換しようとすると、コンソールに「QApplication インスタンスは既に存在します」と表示されます。
OS X 10.7.3(テスト用)でDjango 1.2.5、Python 2.7、QT 4.8、およびPySide 1.1を使用しています。
コード:
def makepdf(response,filename):
try:
app = QApplication(sys.argv)
except:
app = QCoreApplication.instance()
web = QWebView()
stylelink = "%s%s" % (media_root,'images/css/reportGenerator.css')
web.settings().setUserStyleSheetUrl(QUrl.fromLocalFile(stylelink))
web.setHtml(response)
printer = QPrinter()
printer.setPageSize(QPrinter.A4)
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName(filename)
def convertToPdf():
web.print_(printer)
#webresponse = web.close()
#QObject.disconnect()
#print QCoreApplication.instance().children()[0].interrupt()
#qthread = QCoreApplication.instance().thread()#.cleanup()
#qthread.exit()
QCoreApplication.exit()
QObject.connect(web, SIGNAL("loadFinished(bool)"), convertToPdf())
コードのコメント:
現在、現在の QApplication インスタンスを使用してコードを実行し続けることができるようにtry
/except
句を作成しました (「インスタンスが存在するエラー」を回避するため) が、これは正しくないようです。つまり、Apache サーバーの実行中に QAppliation を実行する (本番環境ではそうなる) のは、少しずれているように思えます。PDF変換が終わったら終了できないのでしょうか?
例やスニペットでよく見られるようにQCoreApplication.exit()
、メソッドを使用しようとしました。sys.exit(app.exec_())
ただし、これはエラーを引き起こし、Python をクラッシュさせ、コードはこれなしで完全に機能します。(まあ、PDFを作成しますが、終了しません)。
コメントアウトされたすべての行は、QApplication を終了するために行った以前の試みです。
要するに、それが何であるかはわかりませんが、終了しません。誰でも理由を提案できますか?
更新:最新の回答の後、入力に応答するようにコードを編集しました。最終的な部分は次のようになります。
def convertToPdf():
web.print_(printer)
app.exit()
web.loadFinished.connect(convertToPdf)
app.exec_()
ただし、まだエラーが発生します。
2012-04-30 00:16:10.791 Python[21241:1803] * +[NSUndoManager _endTopLevelGroupings] でのアサーションの失敗、/SourceCache/Foundation/Foundation-833.24/Misc.subproj/NSUndoManager.m :324
Qt がスローされた例外をキャッチしましたイベントハンドラーから。Qt では、イベント ハンドラーからの例外のスローはサポートされていません。QApplication::notify() を再実装し、そこですべての例外をキャッチする必要があります。
このエラーは、実装した場合にのみ発生しますapp.exec_()
。ただし、app.exec_()
それがなければ、通常の問題であり、終了することはありません。
何か案は?
更新 2:これは、matas の最新の提案に従って修正された最新のコードです。
app = QApplication(sys.argv)
web = QWebView()
printer = QPrinter()
printer.setPageSize(QPrinter.A4)
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName(filename)
def convertToPdf():
web.print_(printer)
app.exit()
web.loadFinished.connect(convertToPdf)
web.setHtml(response)
しかし、私はまだ同じ問題を抱えています。