Skip to content

vtk窗口加载到FramelessWindow上, 最大化显示时vtk控件出现移位 #204

@DrinkSth

Description

@DrinkSth

bug描述:
framelesswindow窗口初始最大化显示, 点击最小化按钮,点击任务栏窗口图标弹出窗口, 界面上控件出现了移位(多重复几次, 移位更明显), 添加了app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings) 这句话后, 仅有vtk控件移位

Image

环境

  • OS: window11
  • DPI scaling: 150%
  • Python: 3.10.12
  • PyQt5: 5.15.10
  • vtk: 9.3.0

复现步骤:
1.正常运行程序, 点击最小化, 窗口隐藏
2.点击任务栏窗口图标, 窗口显示 -- vtk控件位置已改变
3.再次点击最小化
4. 再次点击任务栏图标,窗口显示-- vtk控件位置变化更明显

Code
最小复现代码

import os
import sys

sys.path.append(os.getcwd())

from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtCore import Qt

import vtk
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor as QVTKInteractor
from qframelesswindow import FramelessWindow


class SRWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.layout = QVBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(0)

        self.vtk_widget = QVTKInteractor(self)
        self.vtk_widget.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())

        self.layout.addWidget(self.vtk_widget)

        self.renderer = vtk.vtkRenderer()
        self.renderer.SetBackgroundAlpha(1)
        self.renderer.SetBackground(0.18, 0.18, 0.18)
        self.vtk_widget.GetRenderWindow().AddRenderer(self.renderer)

        self.vtk_widget.Initialize()


class MainWindow(FramelessWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("Interactive Viewer")

        self.mainLayout = QVBoxLayout(self)
        print(self.titleBar.height())
        self.mainLayout.setContentsMargins(0, self.titleBar.height(), 0, 0)
        self.mainLayout.setSpacing(0)

        self.sr_widget = SRWidget()
        btn1 = QPushButton("this A Button")
        btn2 = QPushButton("this B Button")

        self.mainLayout.addWidget(btn1)
        self.mainLayout.addWidget(self.sr_widget)
        self.mainLayout.addWidget(btn2)

        self._create_test_cube()

    def _create_test_cube(self):
        cube = vtk.vtkCubeSource()
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputConnection(cube.GetOutputPort())

        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetColor(0.5, 0.8, 0.5)

        self.sr_widget.renderer.AddActor(actor)
        self.sr_widget.renderer.ResetCamera()
        self.sr_widget.vtk_widget.GetRenderWindow().Render()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)
    window = MainWindow()
    window.showMaximized()
    sys.exit(app.exec_())

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions