Slicer学习笔记(五十八)UI控件

Slicer学习笔记(五十八)UI控件,第1张

Slicer学习笔记(五十八)UI控件
  • 1、下拉列表框控件 QComboBox
  • 2、ctk.ctkCollapsibleButton 示例代码
    • 2.1、示例1:XNATBrowser.py
    • 2.2、示例2:CIP_LesionModel.py
  • 3、CTK完整教程(OSGI for C++ 实现 C++ Qt 模块化)
    • 3.1、CTK介绍
    • 3.2、CTK Plugin Framework

最近在关注控件的实现和调用,所以整理一下slicer中会用到的控件,可以是qt或者ctk控件。


1、下拉列表框控件 QComboBox
QComboBox下拉列表框QComboBox以占用最少屏幕空间的方式向用户显示选项列表。


它是一个选择控件,显示当前项目,并可以d出可选项目列表。


组合框可以是可编辑的,允许用户修改列表中的每个项目。


QComboBox类属性editable 设置是否可编辑 currentText设置当前列表框显示内容(前提是先在列表框添加内容) currentIndex设置当前列表框显示内容的索引(前提是先在列表框添加内容) maxVisibleitems当下拉列表d出时,允许显示的最大子项目 maxCount设置下拉选项集合中的数目 insertPolicy设置用户在可编辑的组合框中输入一个新的字符串时插入的策略NoInsert 不插入 InsertAtTop 在顶部插入 InsertAtCurrent在当前插入 InsertAtBottom 在底部插入 InsertAfterCurrent 在当前的后面插入 InsertBeforeCurrent 在当前的前面插入 InsertAlphabetically 按字母顺序插入sizeAdjustPolicy大小调节策略AdjustToContents 根据所有内容的长度 AdjustToContentsOnFirstShow根据第一次显示的内容长度 AdjustToMinimumContentsLength 适应最小内容长度 AdjustToMinimumContentsLengthWithIcon 适应最小内容长度与图标minimumContentsLength 最小的内容长度 iconSize 图标大小 duplicatesEnabled 设置用户在可编辑的组合框中重复添加 frame 边框 modelColumn设置显示的模型列 QComboBox信号 信号触发条件:activated(QString) 与用户交互时,某个条目被选中发出信号,并传递条目的值 activated(int) 与用户交互时,某个条目被选中发出信号,并传递条目的索引 currentIndexChanged(QString) 当前索引发生改变时发出信号,并传递改变之后的值(用户交互,代码控制) currentIndexChanged(int) 当前索引发生改变时发出信号,并传递改变之后的索引(用户交互,代码控制) currentTextChanged(QString) 当前文本内容发生改变时,并传递文本内容 editTextChanged(QString) 编辑的文本发生改变时发出信号,并传递文本内容 highlighted(QString) 在下拉列表中,鼠标移动到某个条目时发出信号,并传递条目的值 highighted(int) 在下拉列表中,鼠标移动到某个条目时发出信号,并传递条目的索引 在Qt Designer中,直接双击可添加下拉框条目

QComboBox 下拉框实例

import sys

from PyQt5.QtWidgets import QWidget, QComboBox, QApplication

class ComboxDemo(QWidget):

def __init__(self):

super().__init__()

# 设置标题

self.setWindowTitle('ComBox例子')

# 设置初始界面大小

self.resize(300, 200)

# 实例化QComBox对象

self.cb = QComboBox(self)

self.cb.move(100, 20)

# 单个添加条目

self.cb.addItem('C')

self.cb.addItem('C++')

self.cb.addItem('Python')

# 多个添加条目

self.cb.addItems(['Java', 'C#', 'PHP'])

# 信号

self.cb.currentIndexChanged[str].connect(self.print_value) # 条目发生改变,发射信号,传递条目内容

self.cb.currentIndexChanged[int].connect(self.print_value) # 条目发生改变,发射信号,传递条目索引

self.cb.highlighted[str].connect(self.print_value) # 在下拉列表中,鼠标移动到某个条目时发出信号,传递条目内容

self.cb.highlighted[int].connect(self.print_value) # 在下拉列表中,鼠标移动到某个条目时发出信号,传递条目索引

def print_value(self, i):

print(i)

if __name__ == '__main__':

app = QApplication(sys.argv)

comboxDemo = ComboxDemo()

comboxDemo.show()

sys.exit(app.exec_())

参考:python中下拉列表框_PyQT5控件:下拉列表框(QComboBox)

QComboBox是一个集按钮和下拉选项于一体的控件,也被称为下拉列表框。



QComboBox类中的常用方法如下表所示:

QComboBox类中的常用信号如下表所示:

来看看QComboBox按钮类的示例,效果如下所示:

在这个例子中显示了一个下拉列表框和一个标签,其中下拉列表框中有5个选项,既可以使用QComboBox的addltem()方法添加单个选项,也可以使用addltems()方法添加多个选项,标签显示的是从下拉列表框中选择的选项。


当下拉列表框中的选项发生改变时将发射currentIndexChanged信号,连接到自定义的槽函数selectionchange()。


在方法中,当选中下拉列表框中的一个选项时,将把该选项的文本设置为标签的文本并调整标签的大小。


实现代码如下所示:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
 
class ComboxDemo(QWidget):
	def __init__(self, parent=None):
		super(ComboxDemo, self).__init__(parent)
		self.setWindowTitle("combox 例子")        
		self.resize(300, 90)                       
		layout = QVBoxLayout()
		self.lbl = QLabel("" )  
         
		self.cb = QComboBox()
		self.cb.addItem("C")
		self.cb.addItem("C++")
		self.cb.addItems(["Java", "C#", "Python"])
		self.cb.currentIndexChanged.connect(self.selectionchange)
		layout.addWidget(self.cb)
		layout.addWidget(self.lbl )
		self.setLayout(layout)
                                    
	def selectionchange(self,i):
		self.lbl.setText( self.cb.currentText() )
		self.lbl.adjustSize()
		
		print( "Items in the list are :" )
		for count in range(self.cb.count()):
			print( 'item'+str(count) + '='+ self.cb.itemText(count) )
			print( "Current index",i,"selection changed ",self.cb.currentText() )
 
if __name__ == '__main__':
	app = QApplication(sys.argv)
	comboxDemo = ComboxDemo()
	comboxDemo.show()
	sys.exit(app.exec_())

参考:Python Qt GUI设计:QComboBox下拉列表框类(基础篇—14)

2、ctk.ctkCollapsibleButton 示例代码

以下示例是关于python中包含ctk.ctkCollapsibleButton用法的示例代码,想了解ctk.ctkCollapsibleButton的具体用法?ctk.ctkCollapsibleButton怎么用?ctk.ctkCollapsibleButton使用的例子?那么可以参考以下10个相关示例代码来学习它的具体使用方法。


2.1、示例1:XNATBrowser.py
## XNAT COLLAPSIBLE BUTTON
    loginCollapsibleButton = ctk.ctkCollapsibleButton()
    loginCollapsibleButton.text = "XNAT Login"
    
    browserCollapsibleButton = ctk.ctkCollapsibleButton()
    browserCollapsibleButton.text = "XNAT TreeView"
   
   statusCollapsibleButton = ctk.ctkCollapsibleButton()
   statusCollapsibleButton.text = "Status"
2.2、示例2:CIP_LesionModel.py
  self.caseSeletorCollapsibleButton = ctk.ctkCollapsibleButton()
       self.caseSeletorCollapsibleButton.text = "Case selector"
      # Nodule segmentation area
       self.noduleSegmentationCollapsibleButton = ctk.ctkCollapsibleButton()
       self.noduleSegmentationCollapsibleButton.text = "Nodule segmentation"

       self.radiomicsCollapsibleButton = ctk.ctkCollapsibleButton()
       self.radiomicsCollapsibleButton.text = "Radiomics"
       # Reports widget
        self.analysisResultsCollapsibleButton = ctk.ctkCollapsibleButton()
       self.analysisResultsCollapsibleButton.text = "Results of the analysis"
           # Add a case list navigator
           caseNavigatorCollapsibleButton = ctk.ctkCollapsibleButton()
            caseNavigatorCollapsibleButton.text = "Case navigator (advanced)"

参考:ctk.ctkCollapsibleButton 示例代码
参考:CTK框架——CTK Widgets快速入门
参考:Documentation/ImageGallery

3、CTK完整教程(OSGI for C++ 实现 C++ Qt 模块化)

CTK框架实际应用比较可靠,但网上资料很少。


本教程围绕 CTK Plugin Framework,探索 C++ 中的模块化技术,并能够基于 CTK 快速搭建 C++ 组件化框架,避免后来的人走弯路。


本教程的源码下载地址:项目源代码。


3.1、CTK介绍

CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit。


CTK插件框架的设计有很大的灵感来自OSGi并且使得应用程序由许多不同的组件组合成一个可扩展模型。


这个模型允许通过那些组件间共享对象的服务通信。


当前,CTK 工作的主要范围包括:

DICOM:提供了从 PACS 和本地数据库中查询和检索的高级类。


包含 Qt 部件,可以轻松地设置服务器连接,并发送查询和查看结果。


DICOM Application Hosting:目标是创建 DICOM Part 19 Application Hosting specifications 的 C++ 参考实现。


它提供了用于创建主机和托管应用程序的基础设。


Widgets:用于生物医学成像应用的 Qt Widgets 集合。


Plugin Framework:用于 C++ 的动态组件系统,以 OSGi 规范为模型。


它支持一个开发模型,在这个模型中,应用程序(动态地)由许多不同(可重用的)组件组成,遵循面向服务的方法。


Command Line Interfaces:一种允许将算法编写为自包含可执行程序的技术,可以在多个终端用户应用程序环境中使用,而无需修改。


3.2、CTK Plugin Framework

CTK Plugin Framework 架构策略
Qt Creator 的可扩展性。



Qt Creator 通过一种简单、优雅的方式来实现可扩展性,它使用一个通用的 QObject 池来实现某些可用的接口。


同时,通过使用嵌入式文本文件(.pluginspec 文件)来向插件添加元数据(例如:Name、Version 等)。



其实严格来说,CTK Plugin Framework 同时借鉴了 OSGi 和 Qt Creator 的思想。


Qt 提供了 Qt Plugin System 和 Qt Service Framework。



Qt Plugin System 提供了两套用于创建插件的 API,高级 API 用于扩展 Qt 本身(例如:自定义数据库驱动、图像格式、文本编解码、自定义样式等),低级 API 用于扩展 Qt 应用程序。



对于 Qt Service Framework 来说,它能使服务的开发和访问方式变得更加容易。


Qt 服务提供者可以与特定于平台的服务进行交互,而无需向客户端公开平台的细节。


每个服务都通过 QObject 指针公开,这意味着客户端可以通过 Qt MetaObject 系统与服务对象进行交互。


CTK Plugin Framework 的架构策略是什么?
CTK Plugin Framework 是基于 Qt Plugin System 和 Qt Service Framework 实现的,并且它还添加了以下特性来增强这两个系统:

插件元数据(由 MANIFEST.MF 文件提供);
一个定义良好的插件生命周期和上下文;
综合服务发现和注册;
……
注意: 在 Qt Plugin System 中,插件的元数据由 JSON 文件提供。



CTK Plugin Framework 的核心架构主要包含两个组件:Plugin System 本身和 Service Registry。


然而,这两个组件是相互关联的,它们在 API 级别上的组合使得系统更加全面、灵活。


Plugin System
CTK Core 依赖于 QtCore 模块,因此 CTK Plugin Framework 基于 Qt Plugin System。


Qt API 允许在运行时加载和卸载插件,这个功能在 CTK Plugin Framework 中得到了加强,以支持透明化延迟加载和解决依赖关系。



插件的元数据被编译进插件内部,可以通过 API 进行提取。


此外,插件系统还使用 SQLite 缓存了元数据,以避免应用程序加载时间问题。


另外,Plugin System 支持通过中央注册中心使用服务。


Service Registry
Qt Service Framework 是 Qt Mobility 项目发布的一个 Qt 解决方案,这种服务框架允许“声明式服务”(Getting Started with OSGi: Introducing Declarative Services )和按需加载服务实现。


为了启用动态(非持久性)服务,Qt Mobility 服务框架可以与 Service Registry 一起使用,类似于 OSGi Core Specifications 中描述的一样。


参考:CTK完整教程(OSGI for C++ 实现 C++ Qt 模块化)
参考:CTK - The Common Toolkit
参考:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/564724.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存