как удалить границы на QGraphicsView в Qt5? - PullRequest
0 голосов
/ 12 июля 2020

В настоящее время я редактирую исходный код инструмента для создания снимков с открытым исходным кодом . Каждый раз, когда я делаю снимок экрана, вид, в котором я выбираю область, которую хочу сделать снимком, имеет границы по краям. Изучив исходный код, я обнаружил, что ответственное за это представление является подклассом QGraphicsView . Кроме того, похоже, что автор программы уже пытался удалить границы, но безрезультатно:

setFrameShape(QFrame::NoFrame);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);

Отсюда

Но я заметил геометрию границы немного изменились при использовании этих линий. Я пробовал несколько собственных строк в классе, который фактически создает экземпляр объекта представления.

(Обратите внимание, что CropView является подклассом ScreenOverlayView, который является подклассом QGraphicsView)

Я добавил следующие строки к этому в функции конструктора:

view->setMaximumSize(image.size());
view->setFixedSize(image.size());
view->viewport()->setFixedSize(image.size());
view->setFrameStyle(QFrame::NoFrame);
view->setContentsMargins(QMargins());

, а затем добавили эту строку после того, как окно было показано:

view->fitInView(image.rect());

Что привело к правильному и нижние границы исчезают. Однако я считаю, что это просто изменяет размер изображения так, чтобы его размер в сочетании с рамкой был в точности моим разрешением экрана. Дополнительным доказательством этого является тот факт, что удаление этих строк дает мне возможность прокручивать вверх и вниз, вправо и влево.

Я также пробовал "фиксированную" версию функции fitInView отсюда как представлено Адриэлем младшим . Он не работал и не удалял границы внизу и справа, как это делала функция fitInView по умолчанию.

В качестве эксперимента я изменил WindowFlags так, что это было только безрамочное окно, которым я мог управлять в моем оконный менеджер. Я обнаружил, что

  • Изменение размера окна за пределами размера изображения приведет только к увеличению границ.
  • Изменение размера окна до точно размера изображения приведет к прокрутке из-за того, что границы занимают то же место, где было бы изображение.
  • Изменение размера окна до размера изображения плюс 5 убирает прокрутку, но отображает границы со всех четырех сторон.
  • Изменение размера окна так, чтобы оно было меньше изображения, в любом случае сохраняло границы.

Кроме того, я попробовал css, упомянутый в этом вопросе , но безрезультатно. Следует отметить, что изменение цвета фона в css изменило цвет границы. Установка прозрачности не удаляла границу.

Я, вероятно, должен упомянуть здесь, что я запускаю Arch Linux с последними установленными обновлениями и использую dwm в качестве оконного менеджера (мозаичного). Я также использую 2 монитора разных размеров.

Вот скриншот границ. Они были выделены зеленым. Обратите внимание, что обычно вы не можете выбрать их, но я обошел это, используя сразу 2 инструмента для создания снимков экрана.

Я изучаю эту проблему в течение нескольких часов и уверен, что я либо глуп, либо это несколько уникальный.

...