Как рисовать контент QTreeview - PullRequest
1 голос
/ 14 февраля 2012

Я пытаюсь нарисовать содержимое QTreeview в QPixmap, чтобы отобразить его в другом QWidget и напечатать.

В настоящее время мой код выглядит так:

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. В противном случае отображается только немного дерева.

Кто-нибудь знает, как решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 14 февраля 2012

Похоже, что эта проблема, скорее всего, связана с тем, что виджет не был изменен по размеру на экране клиента, прежде чем пытаться отобразить его в QPixmap.

Вы можете вызвать show () в QTreeView перед рисованием его в QPixmap или попытаться вычислить измерения в вашем методе.

...