1

別の QWidget でレンダリングして印刷するために、QPixmap で QTreeview のコンテンツをペイントしようとしています。

現在、私のコードは次のようになります。

QPixmap PrintWidget::getTreeView(QTreeView* treeview){

    QAbstractItemView::ScrollMode scrollMode = treeview->verticalScrollMode();

    treeview->selectionModel()->setCurrentIndex(QModelIndex(),QItemSelectionModel::Clear);
    treeview->setVerticalScrollMode(QTreeView::ScrollPerPixel);

    int width = treeview->viewport()->size().width();
    int scrollMax = treeview->verticalScrollBar()->maximum();
    int height = treeview->maximumViewportSize().height() + scrollMax;

    int currentPosition = treeview->verticalScrollBar()->sliderPosition();

    treeview->verticalScrollBar()->setSliderPosition(0);

    QPixmap pixmap(width,height);

    QRegion region(0,0,width,height);
    QPainter painter(&pixmap);

    treeview->viewport()->render(&painter,QPoint(),region,
                                 RenderFlags(QWidget::DrawChildren|QWidget::IgnoreMask));

    treeview->verticalScrollBar()->setSliderPosition(currentPosition);
    treeview->setVerticalScrollMode(scrollMode);

    return pixmap;
}

これは、QTreeview が既にユーザーに表示されている場合に非常にうまく機能します。ツリービューは、メイン ウィンドウのタブに表示されます。ユーザーがツリービューを表示し、上記のコードを実行するボタンをクリックすると、すべてのツリービューが QPixmap に表示されます。それ以外の場合は、ツリービューの一部のみが表示されます。

この問題を解決する方法を知っている人はいますか?

ありがとう

4

1 に答える 1

0

この問題は、QPixmap でウィジェットをレンダリングしようとする前に、ウィジェットがクライアントの画面に合わせてサイズ変更されていないことに関連している可能性が最も高いようです。

QTreeView を QPixmap に描画する前に show() を呼び出すか、メソッド内で寸法の計算を試みることができます。

于 2012-02-14T18:09:02.673 に答える