class One(QObject): def __init__(self, parent): super().__init__() self._parent = parent self._board = QWidget(self._parent) self._board.resize(300, 300) self._board.setStyleSheet( 'QWidget {background-color: rgb(60, 60, 60)}') self._board.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.NoDropShadowWindowHint) # BUTTON self._button = QPushButton(self._parent) self._button.resize(30, 30) self._button.move(50, 50) self._button.setText('ok') self._button.setStyleSheet( 'QPushButton {background: rgb(255, 255, 255)}') self._button.pressed.connect(self._pressed) self._button.released.connect(self._released) # TEST_WIDGET self._test_widget1 = QToolBox(self._parent) self._test_widget1.resize(100, 100) self._button.show() self._test_widget1.show() self._board.show() def _pressed(self): self._test_widget1.setStyleSheet( 'QToolBox {background-color: rgb(255, 0, 0)}') self._test_widget1.setVisible(True) self._button.setText('Pressed') def _released(self): self._test_widget1.setVisible(False) self._button.setText('Released')
def init_window(self): self.setWindowIcon(QtGui.QIcon(self.iconName)) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.setStyleSheet("background-color:orange") vbox = QVBoxLayout() toolbox = QToolBox() toolbox.setStyleSheet("background-color:grey") vbox.addWidget(toolbox) label = QLabel() toolbox.addItem(label, "Python") label1 = QLabel() toolbox.addItem(label1, "Java") label2 = QLabel() toolbox.addItem(label2, "C++") self.setLayout(vbox) self.show()
def initUI(self): vbox = QVBoxLayout() toolbox = QToolBox() toolbox.setStyleSheet('background-color:green') toolbox.addItem(QLabel(), "Python") toolbox.addItem(QLabel(), "Java") toolbox.addItem(QLabel(), "C++") vbox.addWidget(toolbox) self.setLayout(vbox)
def init_ui(self): vbox = QVBoxLayout() toolbox = QToolBox() toolbox.setStyleSheet("background-color:green") vbox.addWidget(toolbox) label = QLabel() toolbox.addItem(label, "Python") label = QLabel() toolbox.addItem(label, "Java") label = QLabel() toolbox.addItem(label, "C++") self.setLayout(vbox)
class UITlvInfo(QGroupBox): __codecinfo_ = None __sdpinfo_ = None __fileinfo_ = None def __init__(self, title: str): super(UITlvInfo, self).__init__(title) self.__initUI() def __initUI(self): vlayout = QVBoxLayout(self) self.__toolBox_ = QToolBox() vlayout.addWidget(self.__toolBox_) # 设置左侧导航栏 toolBox 初始化时的宽度 self.__toolBox_.setStyleSheet("QToolBoxButton { min-width:180px}") # 设置左侧导航栏 toolBox 在左右拉拽时的最小宽度 self.__toolBox_.setMinimumWidth(100) # 设置软件启动时默认打开导航栏的第几个 Item;这里设置的是打开第1个 Item。 self.__toolBox_.setCurrentIndex(0) # self.__toolBox_.setFrameShape(QToolBox.Shape.StyledPanel) # 为toolbox增加边框 # self.__toolBox_.set self.setFileInfoText(info) self.setTlvSdpText(sdp) self.setTlvCodecText('') def setFileInfoText(self, text: str): if self.__fileinfo_ is None: self.__fileinfo_ = QTextBrowser() self.__toolBox_.addItem(self.__fileinfo_, "File Info") self.__fileinfo_.setText(text) def setTlvSdpText(self, text): if self.__sdpinfo_ is None: self.__sdpinfo_ = QTextBrowser() self.__toolBox_.addItem(self.__sdpinfo_, 'Sdp Info') self.__sdpinfo_.setText(text) def setTlvCodecText(self, text): if self.__codecinfo_ is None: self.__codecinfo_ = QTextBrowser() self.__toolBox_.addItem(self.__codecinfo_, 'Codec Info') self.__codecinfo_.setText(text)
def __init__(self): super(MainForm, self).__init__() # 主窗口初始化时实现主窗口布局 self.setupUi(self) toolBox = QToolBox() # 设置左侧导航栏 toolBox 初始化时的宽度 toolBox.setStyleSheet("QToolBoxButton { min-width:210px}") # 设置左侧导航栏 toolBox 在左右拉拽时的最小宽度 toolBox.setMinimumWidth(100) toolBox.addItem(QPushButton("Tab Content 1"), "Tab &1") toolBox.addItem(QLabel("Tab Content 2"), "生产动态分析测试与建模") toolBox.addItem(QPlainTextEdit('Text 3'), QIcon('snapshot.png'), "设置") toolBox.setCurrentIndex(0) # 设置软件启动时默认打开导航栏的第几个 Item;这里设置的是打开第1个 Item。 self.verticalLayout.addWidget(toolBox) # # 下面两行为设置 QSplitter 分割器伸缩大小因子,但是这样设置全屏后导航栏放大了不好看 # self.splitter.setStretchFactor(0, 30) # 分割器左边第1个占比例30% # self.splitter.setStretchFactor(1, 70) # 分割器左边第1个占比例70% # 下面一行为设置 QSplitter 分割器伸缩大小因子,但是这样设置全屏后导航栏放大了比较好看;不清楚原因。 self.splitter.setStretchFactor( 0, 0 ) # 此函数用于设定:控件是否可伸缩。第一个参数用于指定控件的序号。第二个函数大于0时,表示控件可伸缩,小于0时,表示控件不可伸缩。 self.splitter.setStretchFactor( 1, 1 ) # 此函数用于设定:控件是否可伸缩。第一个参数用于指定控件的序号。第二个函数大于0时,表示控件可伸缩,小于0时,表示控件不可伸缩。 # 设置 QSplitter 分割器各部分最小化时的情况,设置为“False”意味着左右拉动分隔栏时各部分不会消失;此设置也可以在界面设计时在 QtDesigner 里设置。 self.splitter.setChildrenCollapsible(False) # 设置 QSplitter 分割器随主窗口自适应大小变化。此设置也可以在界面设计时在 QtDesigner 里设置。 self.splitter.setAutoFillBackground(True) # 主窗口初始化时实例化子窗口 self.child = ChildrenForm() # 在主窗口的QSplitter里添加子窗口 self.splitter.addWidget(self.child)
def InitWindow(self): self.setWindowIcon(QtGui.QIcon(self.IconName)) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) #self.setStyleSheet('background-color:green') vbox = QVBoxLayout() toolbox = QToolBox() toolbox.setStyleSheet('background-color:green') self.label = QLabel() self.label2 = QLabel() self.label3 = QLabel() toolbox.addItem(self.label, "Python") toolbox.addItem(self.label2, "Java") toolbox.addItem(self.label3, "C++") vbox.addWidget(toolbox) self.setLayout(vbox) self.show()
class Test(QMainWindow): def __init__(self): super().__init__() signal.signal(signal.SIGINT, self.exit) self._screen_size = QApplication.primaryScreen().size() # WIDGET self._widget = QWidget(self) self.setCentralWidget(self._widget) self._widget.resize(self._screen_size) self._widget.event = types.MethodType(self._handle_event, self._widget) self._widget.setAttribute(Qt.WA_AcceptTouchEvents | Qt.WA_TranslucentBackground) self._widget.setWindowFlags(Qt.NoDropShadowWindowHint) # VTK self._vtk_widget = QVTKRenderWindowInteractor(self._widget) self._vtk_widget.resize(self._screen_size) self._ren_win = self._vtk_widget.GetRenderWindow() self._interactor = self._ren_win.GetInteractor() self._vtk_widget.SetInteractorStyle(InteractorStyle()) self._sw, self._sh = self._screen_size.width(), self._screen_size.height() self.resize(int(self._sw * 0.7), int(self._sh * 0.7)) self.move(int(self._sw * (1 - 0.7) / 2), int(self._sh * (1 - 0.7) / 2)) # STYLE self._widget.setFocus() QApplication.setStyle('Fusion') # self.setAttribute(Qt.WA_TranslucentBackground) # 开启touch事件之后 # QMainWindow不可开启此方法,会把子类所有插件变透明,且报qt.qpa.xcb: QXcbConnection: XCB error: 8 (BadMatch) 错误 # TEST_DOCK self._dock = QWidget(self) self._dock.resize(70, 150) self._dock.move(int(self._sw * 0.7 - 80), 100) self._dock.setStyleSheet('QWidget {background: rgb(60, 60, 60)}') self._dock.show() # TEST_BTN self._button = QPushButton(self._dock) self._button.setText('test') self._button.setStyleSheet('QPushButton {background: rgb(255, 255, 255)}') self._button.pressed.connect(self._pressed) self._button.released.connect(self._released) self._button.resize(60, 60) self._button.move(5, 5) self._button.show() # TEST_PANEL self._bar = QWidget(self) self._bar.resize(340, 450) self._bar.move(int(self._sw * 0.7 - 425), 100) self._bar.show() self._bar.setVisible(False) # TEST_TOOL_BOX self._tool_box = QToolBox(self._bar) self._tool_box.resize(340, 450) self._tool_box.show() # RENDER self._renderer = vtk.vtkOpenGLRenderer() self._renderer.SetBackground((0, 0, 0)) self._renderer.AddActor(self._axis_actor()) self._renderer.AddActor(self._stl_actor()) self._camera = self._renderer.GetActiveCamera() self._ren_win.AddRenderer(self._renderer) self._ren_win.Render() # CAMERA self._camera = self._renderer.GetActiveCamera() self._camera.SetPosition(13, 0, 0) self._vtk_widget.Start() # TIMER self._timer = QTimer() self._timer.setInterval(int(1000 / 60)) self._timer.timeout.connect(self._render_once) self._timer.start() def _handle_event(self, widget, event): if event.type() in [QEvent.TouchBegin, QEvent.TouchUpdate, QEvent.TouchEnd]: touch_points = event.touchPoints() touch_point_number = len(touch_points) print(touch_point_number) if touch_point_number == 1: lpt = touch_points[0].lastNormalizedPos() # 获取相对距离 pt = touch_points[0].normalizedPos() dpt = pt - lpt self._camera.Azimuth(-dpt.x() * S_P1) # 物体视觉上旋转与相机相反,为了逻辑符合,应取负值 self._camera.Elevation(dpt.y() * S_P1) self._camera.OrthogonalizeViewUp() # 屏蔽90度半球跳转问题 elif touch_point_number == 2: if 'generic' in platform(): lpt0 = touch_points[0].lastNormalizedPos() pt0 = touch_points[0].normalizedPos() lpt1 = touch_points[1].lastNormalizedPos() pt1 = touch_points[1].normalizedPos() ldpt = lpt0 - lpt1 dpt = pt0 - pt1 # 缩放 ldis = ldpt.manhattanLength() # 上一次两点间距 dis = dpt.manhattanLength() # 本次两点间距 ddis = dis - ldis scale = 1 + ddis if ddis > 0 else 1 / (1 - ddis) # 根据距离差计算缩放 self._camera.Dolly(scale) # 旋转 la = get_angle(ldpt) a = get_angle(dpt) da = a - la self._camera.Roll(-degrees(da)) # 物体视觉上旋转与相机相反,为了逻辑符合,应取负值 elif touch_point_number == 3: lpt = QPointF() pt = QPointF() for point in touch_points: lpt += point.lastNormalizedPos() pt += point.normalizedPos() dpt = pt - lpt self._camera.Yaw(dpt.x() * S_P3) self._camera.Pitch(dpt.y() * S_P3) widget.update() return True def _render_once(self): self._interactor.Render() def _pressed(self): self._tool_box.setStyleSheet('QToolBox {background-color: rgba(30, 30, 30, 1)}') self._bar.setVisible(True) self._button.setText('Pressed') def _released(self): self._bar.setVisible(False) self._button.setText('Released') @staticmethod def _axis_actor(): actor = vtk.vtkAxesActor() actor.SetTotalLength(2, 2, 2) actor.SetShaftType(0) actor.SetCylinderRadius(0.01) actor.GetXAxisCaptionActor2D().SetWidth(0.01) actor.GetYAxisCaptionActor2D().SetWidth(0.01) actor.GetZAxisCaptionActor2D().SetWidth(0.01) return actor def _stl_actor(self): actor = vtk.vtkActor() mapper = vtk.vtkPolyDataMapper() actor.SetMapper(mapper) stl = vtk.vtkSTLReader() if 'generic' in platform(): stl.SetFileName('/home/xyz/Desktop/QtTouchEvent_2020101006PM/VTK/Board.stl') else: stl.SetFileName('VTK/Board.stl') mapper.SetInputConnection(stl.GetOutputPort()) stl.Update() return actor def exit(self, signum=None, frame=None): self._ren_win.GetInteractor().DestroyTimer() self._timer.stop() self.close()
class Test(QMainWindow): def __init__(self): super().__init__() signal.signal(signal.SIGINT, self.exit) # WIDGET self._widget = QWidget(self) self.setCentralWidget(self._widget) self.resize(900, 900) self._widget.event = types.MethodType(self._handle_event, self._widget) self._widget.setAttribute(Qt.WA_AcceptTouchEvents | Qt.WA_TranslucentBackground) self._widget.setWindowFlags(Qt.NoDropShadowWindowHint) # VTK self._vtk_widget = QVTKRenderWindowInteractor(self._widget) self._vtk_widget.resize(900, 900) self._ren_win = self._vtk_widget.GetRenderWindow() self._interactor = self._ren_win.GetInteractor() self._vtk_widget.SetInteractorStyle(InteractorStyle()) # # TEST_WIDGET self._test_widget = QWidget(self) self._test_widget.resize(300, 300) self._test_widget.setStyleSheet( 'QWidget {background: rgb(60, 60, 60)}') # TEST_BTN self._button = QPushButton(self._test_widget) self._button.setText('test') self._button.setStyleSheet( 'QPushButton {background: rgb(255, 255, 255)}') self._button.pressed.connect(self._pressed) self._button.released.connect(self._released) self._button.resize(100, 30) self._button.move(100, 200) self._test_widget1 = QToolBox(self._test_widget) self._test_widget1.resize(100, 100) self._test_widget1.show() self._button.show() self._test_widget.show() # RENDER self._renderer = vtk.vtkOpenGLRenderer() self._renderer.SetBackground((0, 0, 0)) self._renderer.AddActor(self._axis_actor()) for actor in self._stl_actor().values(): self._renderer.AddActor(actor) self._camera = self._renderer.GetActiveCamera() self._ren_win.AddRenderer(self._renderer) self._ren_win.Render() # CAMERA self._camera = self._renderer.GetActiveCamera() self._camera.SetPosition(13, 0, 0) self._vtk_widget.Start() # TIMER self._timer = QTimer() self._timer.setInterval(int(1000 / 60)) self._timer.timeout.connect(self._render_once) self._timer.start() def _handle_event(self, widget, event): if event.type() in [ QEvent.TouchBegin, QEvent.TouchUpdate, QEvent.TouchEnd ]: touch_points = event.touchPoints() self._touch_point_number = len(touch_points) print(self._touch_point_number) if self._touch_point_number == 1: lpt = touch_points[0].lastNormalizedPos() # 获取相对距离 pt = touch_points[0].normalizedPos() dpt = pt - lpt self._camera.Azimuth(-dpt.x() * S_P1) # 物体视觉上旋转与相机相反,为了逻辑符合,应取负值 self._camera.Elevation(dpt.y() * S_P1) elif self._touch_point_number == 2: lpt0 = touch_points[0].lastNormalizedPos() pt0 = touch_points[0].normalizedPos() lpt1 = touch_points[1].lastNormalizedPos() pt1 = touch_points[1].normalizedPos() ldpt = lpt0 - lpt1 dpt = pt0 - pt1 # 缩放 ldis = ldpt.manhattanLength() # 上一次两点间距 dis = dpt.manhattanLength() # 本次两点间距 ddis = dis - ldis scale = 1 + ddis if ddis > 0 else 1 / (1 - ddis) # 根据距离差计算缩放 self._camera.Dolly(scale) # 旋转 la = get_angle(ldpt) a = get_angle(dpt) da = a - la self._camera.Roll(-degrees(da)) # 物体视觉上旋转与相机相反,为了逻辑符合,应取负值 elif self._touch_point_number == 3: lpt = QPointF() pt = QPointF() for point in touch_points: lpt += point.lastNormalizedPos() pt += point.normalizedPos() dpt = pt - lpt self._camera.Yaw(dpt.x() * S_P3) self._camera.Pitch(dpt.y() * S_P3) # widget.update() return True def _render_once(self): self._interactor.Render() def _pressed(self): self._test_widget1.setStyleSheet( 'QToolBox {background-color: rgb(255, 0, 0)}') self._test_widget1.setVisible(True) self._button.setText('Pressed') def _released(self): self._test_widget1.setVisible(False) self._button.setText('Released') @staticmethod def _axis_actor(): actor = vtk.vtkAxesActor() actor.SetTotalLength(2, 2, 2) actor.SetShaftType(0) actor.SetCylinderRadius(0.01) actor.GetXAxisCaptionActor2D().SetWidth(0.01) actor.GetYAxisCaptionActor2D().SetWidth(0.01) actor.GetZAxisCaptionActor2D().SetWidth(0.01) return actor def _stl_actor(self): stls = dict() actors = dict() mappers = dict() for i, stl in enumerate([ '/home/xyz/Desktop/VTK读取stl文件+touchevent融合/Board.stl', '/home/xyz/Desktop/VTK读取stl文件+touchevent融合/Arm.stl' ]): actors[i] = vtk.vtkActor() mappers[i] = vtk.vtkPolyDataMapper() actors[i].SetMapper(mappers[i]) stls[i] = vtk.vtkSTLReader() stls[i].SetFileName(stl) mappers[i].SetInputConnection(stls[i].GetOutputPort()) stls[i].Update() return actors def exit(self, signum=None, frame=None): self._ren_win.GetInteractor().DestroyTimer() self._timer.stop() self.close()
def __init__(self,readme_text): '''Initialize ReadmeWindow''' super().__init__() # icon path self.icon_path = ':/plugins/cruisetools/icons' # set window size self.resize(600, 570) # set window icon icon = QIcon(f'{self.icon_path}/icon.png') self.setWindowIcon(icon) # set windows title self.setWindowTitle('Readme') # create layout layout = QGridLayout() # create title, big font, centered title = QLabel() title.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) title_font = QFont('Default', 14, QFont.Bold) title.setFont(title_font) # add title to layout layout.addWidget(title, 0, 0) # create version text, centered under title version = QLabel() version.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) version_font = QFont('Default', 10) version.setFont(version_font) # add version to layout layout.addWidget(version, 1, 0) # create toolbox toolbox = QToolBox() # toolbox styleSheet toolbox_style = ''' QToolBox::tab { border: 1px solid #C4C4C3; font-size: 9pt; } QToolBox::tab:selected { background-color: RGB(200, 0, 200); } ''' # set toolbox style toolbox.setStyleSheet(toolbox_style) # add toolbox to layout layout.addWidget(toolbox, 2, 0) # splot readme text in text blocks blocks = readme_text.split('\n## ') # handle title and version block for line in blocks[0].splitlines(): line = line.strip() if line.startswith('# '): title_text = line.replace("# ","") elif line.startswith('*v'): version_text = line.replace("*","") # set version and title text title.setText(title_text) version.setText(version_text) # create toolbox content from text blocks idx = 0 for block in blocks[1:]: # get block title and content block_title,md = block.split('\n',1) # convert markdown to html (cheap way) << setMarkdown in PyQt 5.15 html = self.markdown(md) # create text field text = QTextEdit() # mak text field read only text.setReadOnly(True) # add content text.setHtml(html) # add text to toolbox toolbox.addItem(text, block_title) # get block icon icon = self.get_icon(block_title) # set block icon toolbox.setItemIcon(idx,icon) idx = idx + 1 # set window layout self.setLayout(layout)