2016-11-27 42 views
1

我想render一個QWidget一個QPrinter設備上沒有GUI阻塞:印刷QWidget的(渲染)GUI線程之外

我的打印方法是這樣的:

void MyClass::print() { 
    QPrinter *printer = new QPrinter(QPrinter::HighResolution); 
    printer->setPageSize(QPrinter::A5); 
    printer->setPageOrientation(QPageLayout::Portrait); 
    printer->setColorMode(QPrinter::Color); 
    QPrintDialog *dialog = new QPrintDialog(printer); 

    if (dialog->exec() == QDialog::Accepted) { 
     MyWidget *_widget = new MyWidget(/* args */); 

     QPainter *painter = new QPainter; 
     painter->begin(printer); 
     double xscale = printer->pageRect().width()/double(_widget ->width()); 
     double yscale = printer->pageRect().height()/double(_widget ->height()); 
     double scale = qMin(xscale, yscale); 
     _widget ->setMinimumWidth((printer->pageRect().width()/scale)); 
     _widget ->setMinimumHeight(printer->pageRect().height()/scale); 
     painter->translate(printer->paperRect().x() + printer->pageRect().width()/2, printer->paperRect().y() + printer->pageRect().height()/2); 
     painter->scale(scale, scale); 
     painter->translate(-_widget ->width()/2, -_widget ->height()/2); 
     _widget ->render(painter); 
     painter->end(); 
    } 
    emit done(); 
} 

有了這個功能我有大約1-2秒塊的狀態,所以我想用QThread對於這個問題,但Qt的Doc說:

儘管QObject的是reentran t,GUI類,特別是QWidget和它的所有子類都不可重入。它們只能從 主線程使用。如前所述,QCoreApplication :: exec()也必須是從該線程調用的 。

而且也:

在實踐中,其他線程 比主線程使用GUI類的不可能很容易被周圍通過把 耗時的操作在一個單獨的工作線程工作,顯示 屏幕上的結果,當工作線程是 完成

我修改Mandelbrot Example但t時的主線程這裏沒有什麼可以在我的情況下顯示在屏幕上。我的Widget應該呈現(耗時操作)併發送到打印機。

那麼你對我的情況有什麼想法嗎?

+3

1)它在哪裏準確地阻止? 2)永遠不能從非GUI線程觸摸QWidget。 – peppe

+0

@ peppe.1。從我們點擊QPrintDialog打印按鈕直到它被髮送到打印機的位置。在網絡打印機上,它大約需要1秒,MyWidget也不復雜 – IMAN4K

+2

一種選擇是修改'_widget'它不直接繪製,而是繪製成「QImage」,然後顯示該圖像。然後,您可以從該插槽中檢索該圖像,並將副本發送給打印圖像的線程。 另一個選擇是移動窗口部件的繪圖代碼到一個帶有'QPainter'的類中,然後打印線程可以實例化該類的一個新對象,並使用它就像窗口部件一樣。 –

回答

1

如果小部件的paintEvent沒有做太多計算,那麼將小部件渲染到QPicture的速度會非常快。 A QPicture只是所有畫家要求的記錄。然後,您可以在並行作業中的打印機上重播它們。

或者,您可以確保窗口小部件不會從主線程中使用(通過隱藏並且沒有父窗口),然後可以從任何線程中調用render

+0

對不起,太遲的回覆。這裏是基於'QPicture'的建議:http://pastebin.com/xGrj4Ykd但是打印結果很小&混亂:(創建'QPrinter'對象是主要問題,並且阻止了我的GUI是否有其他解決方法? – IMAN4K

+0

您可以完全控制結果的縮放比例,按照您希望的方式縮放它:) –