_widget
来源:互联网 发布:java web博客网站设计 编辑:程序博客网 时间:2024/06/05 15:48
import os,sys,re
from bqt import QtCore, QtGui
import bglobal
from _widget import *
if bglobal.PLATFORM == ‘linux’:
if ‘/usr/local/pfx/qube/api/python’ not in sys.path:
sys.path.append(‘/usr/local/pfx/qube/api/python’)
import qb
elif bglobal.PLATFORM == ‘win’:
if r’C:\Program Files\pfx\qube\api\python’ not in sys.path:
sys.path.append(r’C:\Program Files\pfx\qube\api\python’)
import qb
elif bglobal.PLATFORM == ‘mac’:
if ‘/Applications/pfx/qube/api/python’ not in sys.path:
sys.path.append(‘/Applications/pfx/qube/api/python’)
import qb
def getGroups():
return list(set([singleHost.get(‘groups’) for singleHost in qb.hostinfo(state=’active’)]))
_ATTRIBUTE = [
{‘label’:’filename’, ‘name’:’filename’, ‘display’: True, ‘type’:TextWidget, ‘args’: None},
{‘label’:’renderDir’, ‘name’:’render_dir’, ‘display’: True, ‘type’:GetDirWidget, ‘args’: None},
{‘label’:’renderer’, ‘name’:’renderer’, ‘display’: True, ‘type’:ComboBoxWidget, ‘args’: [‘vray’,’mayaSoftware’]},
{‘label’:’frameRange’, ‘name’:’frame_range’, ‘display’: True, ‘type’:TextWidget, ‘args’: None},
{‘label’:’camera’, ‘name’:’camera’, ‘display’: True, ‘type’:ComboBoxWidget, ‘args’: [‘persp’]},
{‘label’:’renderLayer’, ‘name’:’renderLayer’, ‘display’: True, ‘type’:ComboBoxWidget, ‘args’: [‘defaultRenderLayer’]},
{‘label’:’width’, ‘name’:’width’, ‘display’: False, ‘type’:SpinBoxWidget, ‘range’: [1,9999999]},
{‘label’:’height’, ‘name’:’height’, ‘display’: False, ‘type’:SpinBoxWidget, ‘range’: [1,9999999]},
{‘label’:’pixelAspectRatio’, ‘name’:’pixelAspectRatio’, ‘display’: False, ‘type’:DoubleSpinBoxWidget, ‘range’: [0,9999999]},
{‘label’:’mayaVersion’, ‘name’:’maya_render_tool_version’, ‘display’: False, ‘type’:ComboBoxWidget, ‘args’: [‘2014’,’2015’,’2016’]},
{‘label’:’groups’, ‘name’:’groups’, ‘display’: False, ‘type’:CheckBoxGroupWidget, ‘args’: getGroups()},
{‘label’:’chunkSize’, ‘name’:’range_chunk_size’, ‘display’: False, ‘type’:SpinBoxWidget, ‘range’: [1,9999999]},
]
class ActionWidget(QtGui.QAction):
changed = QtCore.Signal(dict)def __init__(self,*argvs): super(ActionWidget,self).__init__(*argvs) self.setCheckable(True) self.toggled.connect(self.signalChanged)def signalChanged(self,isChecked): self.changed.emit({'title':self.text(),'isChecked':isChecked})
class MenuWidget(QtGui.QMenu):
def __init__(self,title,parent = None): super(MenuWidget,self).__init__(title = title,parent = parent) self.children = list() self.setTearOffEnabled(True) self._addAction()def _addAction(self): for i in _ATTRIBUTE: action = ActionWidget(i.get('label'),self) action.setCheckable(True) self.addAction(action) self.children.append(action)def getChildren(self): return self.children
class WidgetDelegate(QtGui.QItemDelegate):
def __init__(self,parent = None): super(WidgetDelegate,self).__init__(parent = parent)def createEditor(self, parent, option, index): editor = _ATTRIBUTE[index.column()].get('type') if _ATTRIBUTE[index.column()].get('args'): #if _ATTRIBUTE[index.column()].get('label') == 'groups': # editor = editor(_ATTRIBUTE[index.column()].get('args'),parent = None) #else: editor = editor(_ATTRIBUTE[index.column()].get('args'),parent = parent) else: editor = editor(parent = parent) if _ATTRIBUTE[index.column()].get('range'): editor.setRange(_ATTRIBUTE[index.column()].get('range')[0], _ATTRIBUTE[index.column()].get('range')[1]) return editordef setEditorData(self, editor, index): value = index.model().data(index, QtCore.Qt.EditRole) if value != None: editor.setValue(value)def setModelData(self, editor, model, index): value = editor.getValue() model.setData(index, value, QtCore.Qt.EditRole)def updateEditorGeometry(self, editor, option, index): editor.setGeometry(option.rect)
class TableWidget(QtGui.QTableView):
def __init__(self,parent = None): super(TableWidget,self).__init__(parent = parent) self.model = QtGui.QStandardItemModel(0, len(_ATTRIBUTE)) self.model.setHorizontalHeaderLabels([i.get('label') for i in _ATTRIBUTE]) self.setModel(self.model) self.delegate = WidgetDelegate() self.setItemDelegate(self.delegate) for i in xrange(len(_ATTRIBUTE)): self.setColumnHidden(i,not _ATTRIBUTE[i].get('display')) self.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy(3)) self.customContextMenuRequested.connect(self.rightClicked) self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.setDragDropMode(QtGui.QAbstractItemView.DropOnly) #QtGui.QAbstractItemView.DragOnly #QtGui.QAbstractItemView.DropOnly #self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)def appendRow(self): row_count = self.model.rowCount() self.model.insertRow(row_count) return row_countdef removeRow(self,index): if isinstance(index,(list,tuple)): index.sort() index.reverse() for i in index: self.model.removeRow(i) else: self.model.removeRow(index) #self.model.takeRow(index)def selectedRowsIndexes(self): indexes = self.selectedIndexes() rowsIndexes = list() for index in indexes: _index = index.row() if not _index in rowsIndexes: rowsIndexes.append(_index) return rowsIndexesdef removeSelectRows(self): indexs = self.selectedRowsIndexes() if indexs: self.removeRow(indexs)def setValue(self,index,value): ''' value is a dict: filename render_dir renderer startFrame endFrame camera renderLayer width height pixelAspectRatio groups maya_render_tool_version groups range_chunk_size ... ''' if index < self.model.rowCount(): for column in range(len(_ATTRIBUTE)): model_index = self.model.index(index, column, QtCore.QModelIndex()) self.model.setData(model_index, value.get(_ATTRIBUTE[column].get('name'))) self.resizeColumnsToContents() else: raise Exception('error: wrong index')def getValue(self,index): value = dict() if index < self.model.rowCount(): for column in range(len(_ATTRIBUTE)): model_index = self.model.index(index, column, QtCore.QModelIndex()) value[_ATTRIBUTE[column].get('name')] = self.model.data(model_index) return value else: raise Exception('error: wrong index')def setColumnDisPlay(self,info = {'title':'camera','isChecked':True}): self.setColumnHidden([i.get('label') for i in _ATTRIBUTE].index(info.get('title')), not info.get('isChecked')) _ATTRIBUTE[[i.get('label') for i in _ATTRIBUTE].index(info.get('title'))]['display'] = info.get('isChecked')def dropEvent(self,event): _widget = event.source() if _widget: indexes = _widget.selectedRowsIndexes() for index in indexes: row_index = self.appendRow() value = _widget.getValue(index) self.setValue(row_index,value)def rightClicked(self,point): menu = QtGui.QMenu(self) args = [ { 'name':'create new Task', 'cmd':self.appendRow, 'isDisabled':False, }, { 'name':'remove selected Task', 'cmd':self.removeSelectRows, 'isDisabled':False, }, ] args[0]['isDisabled'] = True if self.currentIndex(): args[1]['isDisabled'] = True for i in args: if i.get('isDisabled'): ac = QtGui.QAction(i.get('name'),menu) ac.triggered.connect(i.get('cmd')) menu.addAction(ac) menu.addSeparator() child = MenuWidget('display',menu) num = 0 for i in child.getChildren(): i.changed.connect(self.setColumnDisPlay) i.setChecked(False) i.setChecked(_ATTRIBUTE[num].get('display')) num +=1 menu.addMenu(child) menu.popup(self.mapToGlobal(point))
class TableWidget2(TableWidget):
def __init__(self,parent = None): super(TableWidget2,self).__init__(parent = parent) self.setDragDropMode(QtGui.QAbstractItemView.DragOnly) #QtGui.QAbstractItemView.DragOnly #QtGui.QAbstractItemView.DropOnly self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
app = QtGui.QApplication(sys.argv)
win = TableWidget()
win.show()
win2 = TableWidget2()
win2.show()
app.exec_()
- _widget
- _Widget
- 99_widget,窗口小部件
- 102_widget的点击事件
- void Oxygen::ComboBoxData::setButton(GtkWidget*): Assertion `!_button._widget' failed.
- VTK修炼之道73:交互部件_Widget应用综述
- VTK修炼之道74:交互部件_Widget的创建
- VTK修炼之道73:交互部件_Widget应用综述
- pyGTK_读书笔记_Tutorial Chapter 5&6_Widget Overview and Button Widget
- Your project contains errors, please fix them 。。。。
- Swift UISlider(滑块)
- 第51条:当心字符串连接的性能
- Android之ViewPager显示应用新特性
- CSS行高——line-height 行间距
- _widget
- unity 固定管线shader转换到顶点片段着色器
- mongodb学习笔记一
- datalab实验 说明文档
- Java数据结构----图--最短路径解法Dijkstra算法和Floyd算法
- 实例分析init.rc的语法
- 修改eclipse中tomcat启动默认超时时间
- RESTFUL API 安全设计指南
- Android Studio 错误 Duplicate files copied in APK META-INF/LICENSE.txt解决方案