From: Chris M. <gi...@gi...> - 2017-02-19 22:08:11
|
qtscreen -add PATH object to handler files - switch to default skin path info could be useful for screen buliders Signed-off-by: Chris Morley <chr...@ho...> Signed-off-by: chris morley <chr...@ho...> http://git.linuxcnc.org/?p=linuxcnc.git;a=commitdiff;h=86e94e2 --- configs/sim/qtscreen/qtscreen.ui | 630 -------------------------- configs/sim/qtscreen/qtscreen_handler.py | 165 ------- configs/sim/qtscreen/qtvcp_postgui.hal | 1 - lib/python/qtvcp/qt_makegui.py | 9 +- share/qtscreen/skins/qt_cnc/qt_cnc.ui | 163 ++++++- share/qtscreen/skins/qt_cnc/qt_cnc_handler.py | 107 ++++- src/emc/usr_intf/qtscreen/qtscreen.py | 6 +- 7 files changed, 257 insertions(+), 824 deletions(-) diff --git a/configs/sim/qtscreen/qtscreen.ui b/configs/sim/qtscreen/qtscreen.ui deleted file mode 100644 index 2c7349b..0000000 --- a/configs/sim/qtscreen/qtscreen.ui +++ /dev/null @@ -1,630 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>Form</class> - <widget class="QWidget" name="Form"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>834</width> - <height>557</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <widget class="QFrame" name="frame"> - <property name="geometry"> - <rect> - <x>210</x> - <y>10</y> - <width>411</width> - <height>541</height> - </rect> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - </widget> - <widget class="Lcnc_LCDNumber" name="lnclcdnumber"> - <property name="geometry"> - <rect> - <x>670</x> - <y>10</y> - <width>141</width> - <height>61</height> - </rect> - </property> - </widget> - <widget class="QPushButton" name="button_estop"> - <property name="geometry"> - <rect> - <x>10</x> - <y>90</y> - <width>93</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>estop</string> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - </widget> - <widget class="QPushButton" name="button_machineon"> - <property name="geometry"> - <rect> - <x>10</x> - <y>130</y> - <width>93</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>machine on</string> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - </widget> - <widget class="QPushButton" name="button_home"> - <property name="geometry"> - <rect> - <x>110</x> - <y>90</y> - <width>93</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>home</string> - </property> - </widget> - <widget class="QFrame" name="button_frame"> - <property name="geometry"> - <rect> - <x>10</x> - <y>270</y> - <width>191</width> - <height>161</height> - </rect> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <widget class="QPushButton" name="jog_neg_z"> - <property name="geometry"> - <rect> - <x>0</x> - <y>120</y> - <width>51</width> - <height>41</height> - </rect> - </property> - <property name="text"> - <string>Z-</string> - </property> - </widget> - <widget class="QPushButton" name="jog_pos_z"> - <property name="geometry"> - <rect> - <x>140</x> - <y>0</y> - <width>51</width> - <height>41</height> - </rect> - </property> - <property name="text"> - <string>Z+</string> - </property> - </widget> - <widget class="QPushButton" name="jog_neg_y"> - <property name="geometry"> - <rect> - <x>80</x> - <y>100</y> - <width>41</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>Y-</string> - </property> - </widget> - <widget class="QPushButton" name="jog_pos_y"> - <property name="geometry"> - <rect> - <x>80</x> - <y>20</y> - <width>41</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>Y+</string> - </property> - </widget> - <widget class="QPushButton" name="jog_pos_x"> - <property name="geometry"> - <rect> - <x>30</x> - <y>60</y> - <width>41</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>X+</string> - </property> - </widget> - <widget class="QPushButton" name="jog_neg_x"> - <property name="geometry"> - <rect> - <x>130</x> - <y>60</y> - <width>41</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>X-</string> - </property> - </widget> - </widget> - <widget class="Graphics" name="graphics"> - <property name="geometry"> - <rect> - <x>240</x> - <y>40</y> - <width>331</width> - <height>461</height> - </rect> - </property> - <property name="view" stdset="0"> - <string>p</string> - </property> - <property name="dtg" stdset="0"> - <bool>false</bool> - </property> - </widget> - <widget class="QSlider" name="jog_slider"> - <property name="geometry"> - <rect> - <x>10</x> - <y>240</y> - <width>101</width> - <height>21</height> - </rect> - </property> - <property name="maximum"> - <number>60</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - <widget class="QLCDNumber" name="lcdNumber"> - <property name="geometry"> - <rect> - <x>133</x> - <y>232</y> - <width>71</width> - <height>31</height> - </rect> - </property> - </widget> - <widget class="Lcnc_GridLayout" name="lcnc_gridlayout"> - <property name="geometry"> - <rect> - <x>20</x> - <y>460</y> - <width>171</width> - <height>71</height> - </rect> - </property> - <property name="toolTip"> - <string>{0}</string> - </property> - <property name="whatsThis"> - <string>{1}</string> - </property> - <property name="styleSheet"> - <string>background-color: rgb(184, 184, 184);</string> - </property> - <widget class="Lcnc_PushButton" name="lncpushbutton"> - <property name="geometry"> - <rect> - <x>20</x> - <y>30</y> - <width>121</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>hal button</string> - </property> - </widget> - </widget> - <widget class="Lcnc_DROLabel" name="lcnc_drolabel_x"> - <property name="geometry"> - <rect> - <x>20</x> - <y>10</y> - <width>111</width> - <height>21</height> - </rect> - </property> - </widget> - <widget class="Lcnc_DROLabel" name="lcnc_drolabel_y"> - <property name="geometry"> - <rect> - <x>20</x> - <y>40</y> - <width>111</width> - <height>21</height> - </rect> - </property> - <property name="Qjoint_number" stdset="0"> - <number>1</number> - </property> - </widget> - <widget class="Lcnc_DROLabel" name="lcnc_drolabel_z"> - <property name="geometry"> - <rect> - <x>20</x> - <y>67</y> - <width>111</width> - <height>20</height> - </rect> - </property> - <property name="text"> - <string>--------------</string> - </property> - <property name="textFormat"> - <enum>Qt::PlainText</enum> - </property> - <property name="scaledContents"> - <bool>true</bool> - </property> - <property name="Qjoint_number" stdset="0"> - <number>2</number> - </property> - </widget> - </widget> - <customwidgets> - <customwidget> - <class>Graphics</class> - <extends>QWidget</extends> - <header>qtvcp_widgets.graphics</header> - </customwidget> - <customwidget> - <class>Lcnc_DROLabel</class> - <extends>QLabel</extends> - <header>qtvcp_widgets.drowidget</header> - <container>1</container> - </customwidget> - <customwidget> - <class>Lcnc_LCDNumber</class> - <extends>QLCDNumber</extends> - <header>qtvcp_widgets.simple_widgets</header> - </customwidget> - <customwidget> - <class>Lcnc_PushButton</class> - <extends>QPushButton</extends> - <header>qtvcp_widgets.simple_widgets</header> - </customwidget> - <customwidget> - <class>Lcnc_GridLayout</class> - <extends>QWidget</extends> - <header>qtvcp_widgets.simple_widgets</header> - <container>1</container> - </customwidget> - </customwidgets> - <resources/> - <connections> - <connection> - <sender>lncpushbutton</sender> - <signal>clicked()</signal> - <receiver>Form</receiver> - <slot>halbuttonclicked()</slot> - <hints> - <hint type="sourcelabel"> - <x>112</x> - <y>451</y> - </hint> - <hint type="destinationlabel"> - <x>112</x> - <y>387</y> - </hint> - </hints> - </connection> - <connection> - <sender>button_estop</sender> - <signal>clicked(bool)</signal> - <receiver>Form</receiver> - <slot>estop_toggled()</slot> - <hints> - <hint type="sourcelabel"> - <x>84</x> - <y>107</y> - </hint> - <hint type="destinationlabel"> - <x>133</x> - <y>109</y> - </hint> - </hints> - </connection> - <connection> - <sender>button_machineon</sender> - <signal>clicked(bool)</signal> - <receiver>Form</receiver> - <slot>machineon_toggled()</slot> - <hints> - <hint type="sourcelabel"> - <x>57</x> - <y>143</y> - </hint> - <hint type="destinationlabel"> - <x>152</x> - <y>170</y> - </hint> - </hints> - </connection> - <connection> - <sender>button_home</sender> - <signal>clicked()</signal> - <receiver>Form</receiver> - <slot>home_clicked()</slot> - <hints> - <hint type="sourcelabel"> - <x>87</x> - <y>214</y> - </hint> - <hint type="destinationlabel"> - <x>145</x> - <y>229</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_pos_x</sender> - <signal>pressed()</signal> - <receiver>Form</receiver> - <slot>jog_pressed()</slot> - <hints> - <hint type="sourcelabel"> - <x>54</x> - <y>285</y> - </hint> - <hint type="destinationlabel"> - <x>97</x> - <y>322</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_pos_x</sender> - <signal>released()</signal> - <receiver>Form</receiver> - <slot>jog_released()</slot> - <hints> - <hint type="sourcelabel"> - <x>56</x> - <y>291</y> - </hint> - <hint type="destinationlabel"> - <x>51</x> - <y>341</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_neg_x</sender> - <signal>pressed()</signal> - <receiver>Form</receiver> - <slot>jog_pressed()</slot> - <hints> - <hint type="sourcelabel"> - <x>142</x> - <y>296</y> - </hint> - <hint type="destinationlabel"> - <x>161</x> - <y>326</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_neg_x</sender> - <signal>released()</signal> - <receiver>Form</receiver> - <slot>jog_released()</slot> - <hints> - <hint type="sourcelabel"> - <x>127</x> - <y>292</y> - </hint> - <hint type="destinationlabel"> - <x>133</x> - <y>323</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_pos_z</sender> - <signal>pressed()</signal> - <receiver>Form</receiver> - <slot>jog_pressed()</slot> - <hints> - <hint type="sourcelabel"> - <x>173</x> - <y>246</y> - </hint> - <hint type="destinationlabel"> - <x>211</x> - <y>263</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_pos_z</sender> - <signal>released()</signal> - <receiver>Form</receiver> - <slot>jog_released()</slot> - <hints> - <hint type="sourcelabel"> - <x>163</x> - <y>230</y> - </hint> - <hint type="destinationlabel"> - <x>194</x> - <y>199</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_neg_z</sender> - <signal>pressed()</signal> - <receiver>Form</receiver> - <slot>jog_pressed()</slot> - <hints> - <hint type="sourcelabel"> - <x>57</x> - <y>364</y> - </hint> - <hint type="destinationlabel"> - <x>172</x> - <y>362</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_neg_z</sender> - <signal>released()</signal> - <receiver>Form</receiver> - <slot>jog_released()</slot> - <hints> - <hint type="sourcelabel"> - <x>54</x> - <y>368</y> - </hint> - <hint type="destinationlabel"> - <x>131</x> - <y>357</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_pos_y</sender> - <signal>pressed()</signal> - <receiver>Form</receiver> - <slot>jog_pressed()</slot> - <hints> - <hint type="sourcelabel"> - <x>98</x> - <y>253</y> - </hint> - <hint type="destinationlabel"> - <x>184</x> - <y>138</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_pos_y</sender> - <signal>released()</signal> - <receiver>Form</receiver> - <slot>jog_released()</slot> - <hints> - <hint type="sourcelabel"> - <x>79</x> - <y>254</y> - </hint> - <hint type="destinationlabel"> - <x>170</x> - <y>177</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_neg_y</sender> - <signal>pressed()</signal> - <receiver>Form</receiver> - <slot>jog_pressed()</slot> - <hints> - <hint type="sourcelabel"> - <x>109</x> - <y>327</y> - </hint> - <hint type="destinationlabel"> - <x>184</x> - <y>320</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_neg_y</sender> - <signal>released()</signal> - <receiver>Form</receiver> - <slot>jog_released()</slot> - <hints> - <hint type="sourcelabel"> - <x>105</x> - <y>336</y> - </hint> - <hint type="destinationlabel"> - <x>134</x> - <y>325</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_slider</sender> - <signal>valueChanged(int)</signal> - <receiver>lcdNumber</receiver> - <slot>display(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>72</x> - <y>242</y> - </hint> - <hint type="destinationlabel"> - <x>169</x> - <y>249</y> - </hint> - </hints> - </connection> - <connection> - <sender>jog_slider</sender> - <signal>valueChanged(int)</signal> - <receiver>Form</receiver> - <slot>change_jograte()</slot> - <hints> - <hint type="sourcelabel"> - <x>61</x> - <y>242</y> - </hint> - <hint type="destinationlabel"> - <x>187</x> - <y>151</y> - </hint> - </hints> - </connection> - </connections> - <slots> - <slot>halbuttonclicked()</slot> - <slot>estop_toggled()</slot> - <slot>machineon_toggled()</slot> - <slot>home_clicked()</slot> - <slot>jog_pressed()</slot> - <slot>jog_released()</slot> - <slot>change_jograte()</slot> - </slots> -</ui> diff --git a/configs/sim/qtscreen/qtscreen_handler.py b/configs/sim/qtscreen/qtscreen_handler.py deleted file mode 100644 index 6a5c402..0000000 --- a/configs/sim/qtscreen/qtscreen_handler.py +++ /dev/null @@ -1,165 +0,0 @@ -from PyQt4 import QtCore -from qtscreen.keybindings import Keylookup,key_pressed -from qtvcp.qt_glib import GStat -import linuxcnc -# instantiate libraries -KEYBIND = Keylookup() -GSTAT = GStat() - -class HandlerClass: - - # This will be pretty standard to gain access. - # widgets allows access to widgets from the qtvcp files - # at this point the widgets and hal pins are not instantiated - def __init__(self, halcomp,widgets): - self.hal = halcomp - self.w = widgets - self.stat = linuxcnc.stat() - self.cmnd = linuxcnc.command() - self.jog_velocity = 10.0 - # connect to GStat to catch linuxcnc events - GSTAT.connect('state-estop', self.say_estop) - GSTAT.connect('state-on', self.on_state_on) - GSTAT.connect('state-off', self.on_state_off) - GSTAT.connect('jograte-changed', self.on_jograte_changed) - - def on_jograte_changed(self, w, rate): - self.jog_velocity = rate - - def change_jograte(self, rate): - GSTAT.set_jog_rate(float(rate)) - - def say_estop(self,w): - print 'saying estop' - - def on_state_on(self,w): - print 'on' - if not self.w.button_machineon.isChecked(): - self.w.button_machineon.click() - - def on_state_off(self,w): - print 'off' - if self.w.button_machineon.isChecked(): - self.w.button_machineon.click() - - def initialized__(self): - print 'INIT' - self.w.button_frame.setEnabled(False) - self.w.jog_slider.setValue(self.jog_velocity) - GSTAT.forced_update() - - def processed_key_event__(self,event,is_pressed,key,code,shift,cntrl): - try: - KEYBIND.call(self,event,is_pressed,shift,cntrl) - except AttributeError: - print 'no function %s in handler file for-%s'%(KEYBIND.convert(event),key_pressed(event)) - return True - - def halbuttonclicked(self): - print 'click' - - def on_keycall_ESTOP(self,event,state,shift,cntrl): - if state: - self.w.button_estop.click() - def on_keycall_POWER(self,event,state,shift,cntrl): - if state: - self.w.button_machineon.click() - def on_keycall_HOME(self,event,state,shift,cntrl): - if state: - self.w.button_home.click() - - def on_keycall_XPOS(self,event,state,shift,cntrl): - if state: - self.w.jog_pos_x.pressed.emit() - else: - self.w.jog_pos_x.released.emit() - def on_keycall_XNEG(self,event,state,shift,cntrl): - if state: - self.w.jog_neg_x.pressed.emit() - else: - self.w.jog_neg_x.released.emit() - - def on_keycall_YPOS(self,event,state,shift,cntrl): - if state: - self.w.jog_pos_y.pressed.emit() - else: - self.w.jog_pos_y.released.emit() - - def on_keycall_YNEG(self,event,state,shift,cntrl): - if state: - self.w.jog_neg_y.pressed.emit() - else: - self.w.jog_neg_y.released.emit() - - def on_keycall_ZPOS(self,event,state,shift,cntrl): - if state: - self.w.jog_pos_z.pressed.emit() - else: - self.w.jog_pos_z.released.emit() - def on_keycall_ZNEG(self,event,state,shift,cntrl): - if state: - self.w.jog_neg_z.pressed.emit() - else: - self.w.jog_neg_z.released.emit() - - - - def estop_toggled(self,pressed): - print 'estop click',pressed - if pressed: - self.cmnd.state(linuxcnc.STATE_ESTOP_RESET) - else: - self.cmnd.state(linuxcnc.STATE_ESTOP) - - def machineon_toggled(self,pressed): - print 'machine on click',pressed - if pressed: - self.cmnd.state(linuxcnc.STATE_ON) - self.w.button_frame.setEnabled(True) - else: - self.cmnd.state(linuxcnc.STATE_OFF) - self.w.button_frame.setEnabled(False) - - def jog_pressed(self): - d = 1 - source = self.w.sender() - #print source.objectName(), 'pressed' - if '-' in source.text(): - d = -1 - if 'X' in source.text(): - self.continous_jog(0, d) - elif 'Y' in source.text(): - self.continous_jog(1, d) - elif 'Z' in source.text(): - self.continous_jog(2, d) - - def jog_released(self): - source = self.w.sender() - #print source.objectName(), 'released' - if 'X' in source.text(): - self.continous_jog(0, 0) - elif 'Y' in source.text(): - self.continous_jog(1, 0) - elif 'Z' in source.text(): - self.continous_jog(2, 0) - - def continous_jog(self, axis, direction): - if direction == 0: - self.cmnd.jog(linuxcnc.JOG_STOP, axis) - else: - speed = direction * self.jog_velocity/60 - self.cmnd.jog(linuxcnc.JOG_CONTINUOUS, axis, speed) - - def home_clicked(self): - print 'home click' - self.cmnd.mode(linuxcnc.MODE_MANUAL) - self.cmnd.home(-1) - - def __getitem__(self, item): - return getattr(self, item) - def __setitem__(self, item, value): - return setattr(self, item, value) - -# standard handler call -def get_handlers(halcomp,widgets): - return [HandlerClass(halcomp,widgets)] diff --git a/configs/sim/qtscreen/qtvcp_postgui.hal b/configs/sim/qtscreen/qtvcp_postgui.hal index d9b8612..e69de29 100644 --- a/configs/sim/qtscreen/qtvcp_postgui.hal +++ b/configs/sim/qtscreen/qtvcp_postgui.hal @@ -1 +0,0 @@ -setp qtscreen.lnclcdnumber 100 diff --git a/lib/python/qtvcp/qt_makegui.py b/lib/python/qtvcp/qt_makegui.py index c0a9e10..cf61f5e 100644 --- a/lib/python/qtvcp/qt_makegui.py +++ b/lib/python/qtvcp/qt_makegui.py @@ -67,14 +67,14 @@ class MyWindow(QtGui.QMainWindow): #for widget in instance.children(): # print widget - def load_extension(self,handlerpath): - methods,self.handler_module,self.handler_instance = self._load_handlers([handlerpath],self.halcomp,self) + def load_extension(self,handlerpath,paths=None): + methods,self.handler_module,self.handler_instance = self._load_handlers([handlerpath],self.halcomp,self,paths) #print methods for i in methods: #print i, methods[i] self[i] = methods[i] - def _load_handlers(self,usermod,halcomp,widgets): + def _load_handlers(self,usermod,halcomp,widgets,paths): hdl_func = 'get_handlers' mod = None object = None @@ -99,6 +99,7 @@ class MyWindow(QtGui.QMainWindow): mod = __import__(basename) except ImportError,msg: print "module '%s' skipped - import error: %s" %(basename,msg) + sys.exit(0) continue dbg("module '%s' imported OK" % mod.__name__) try: @@ -107,7 +108,7 @@ class MyWindow(QtGui.QMainWindow): if h and callable(h): dbg("module '%s' : '%s' function found" % (mod.__name__,hdl_func)) - objlist = h(halcomp,widgets) + objlist = h(halcomp,widgets,paths) # this sets the handler class signature else: # the module has no get_handlers() callable. # in this case we permit any callable except class Objects in the module to register as handler diff --git a/share/qtscreen/skins/qt_cnc/qt_cnc.ui b/share/qtscreen/skins/qt_cnc/qt_cnc.ui index c1f12ed..2c7349b 100644 --- a/share/qtscreen/skins/qt_cnc/qt_cnc.ui +++ b/share/qtscreen/skins/qt_cnc/qt_cnc.ui @@ -32,7 +32,7 @@ <widget class="Lcnc_LCDNumber" name="lnclcdnumber"> <property name="geometry"> <rect> - <x>10</x> + <x>670</x> <y>10</y> <width>141</width> <height>61</height> @@ -178,19 +178,6 @@ </property> </widget> </widget> - <widget class="Lcnc_PushButton" name="lncpushbutton"> - <property name="geometry"> - <rect> - <x>40</x> - <y>470</y> - <width>121</width> - <height>27</height> - </rect> - </property> - <property name="text"> - <string>hal button</string> - </property> - </widget> <widget class="Graphics" name="graphics"> <property name="geometry"> <rect> @@ -207,6 +194,109 @@ <bool>false</bool> </property> </widget> + <widget class="QSlider" name="jog_slider"> + <property name="geometry"> + <rect> + <x>10</x> + <y>240</y> + <width>101</width> + <height>21</height> + </rect> + </property> + <property name="maximum"> + <number>60</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + <widget class="QLCDNumber" name="lcdNumber"> + <property name="geometry"> + <rect> + <x>133</x> + <y>232</y> + <width>71</width> + <height>31</height> + </rect> + </property> + </widget> + <widget class="Lcnc_GridLayout" name="lcnc_gridlayout"> + <property name="geometry"> + <rect> + <x>20</x> + <y>460</y> + <width>171</width> + <height>71</height> + </rect> + </property> + <property name="toolTip"> + <string>{0}</string> + </property> + <property name="whatsThis"> + <string>{1}</string> + </property> + <property name="styleSheet"> + <string>background-color: rgb(184, 184, 184);</string> + </property> + <widget class="Lcnc_PushButton" name="lncpushbutton"> + <property name="geometry"> + <rect> + <x>20</x> + <y>30</y> + <width>121</width> + <height>27</height> + </rect> + </property> + <property name="text"> + <string>hal button</string> + </property> + </widget> + </widget> + <widget class="Lcnc_DROLabel" name="lcnc_drolabel_x"> + <property name="geometry"> + <rect> + <x>20</x> + <y>10</y> + <width>111</width> + <height>21</height> + </rect> + </property> + </widget> + <widget class="Lcnc_DROLabel" name="lcnc_drolabel_y"> + <property name="geometry"> + <rect> + <x>20</x> + <y>40</y> + <width>111</width> + <height>21</height> + </rect> + </property> + <property name="Qjoint_number" stdset="0"> + <number>1</number> + </property> + </widget> + <widget class="Lcnc_DROLabel" name="lcnc_drolabel_z"> + <property name="geometry"> + <rect> + <x>20</x> + <y>67</y> |