def setqtgraph(self): self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ren = vtkRenderer() self.test = QtWidgets.QWidget(self.ui.vtk_panel) self.gridlayout = QtWidgets.QGridLayout(self.test) self.vtkWidget = QVTKRenderWindowInteractor(self.test) self.gridlayout.addWidget(self.vtkWidget, 0, 0, 1, 1) #self.setCentralWidget(self.test) self.vtkWidget.GetRenderWindow().AddRenderer(self.ren) self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
时间: 2024-04-26 08:21:39 浏览: 9
这段代码是用来在 PyQt5 中显示 VTK 渲染的窗口。其中,通过 `vtkRenderer()` 创建一个 VTK 渲染器,然后将它添加到 `QVTKRenderWindowInteractor` 中,最后通过 `QGridLayout` 将 `QVTKRenderWindowInteractor` 添加到 `QtWidgets.QWidget` 中,从而实现了在 PyQt5 界面中显示 VTK 窗口的效果。
相关问题
def setup(self): import glyph_ui self.ui = glyph_ui.Ui_MainWindow() self.ui.setupUi(self) self.vtk_widget = QGlyphViewer(self.ui.vtk_panel, self) self.ui.vtk_layout = QtWidgets.QHBoxLayout() self.ui.vtk_layout.addWidget(self.vtk_widget) self.ui.vtk_layout.setContentsMargins(0,0,0,0) self.ui.vtk_panel.setLayout(self.ui.vtk_layout)
这是一个在 PyQt5 中用于设置 UI 界面的方法。其中,该方法使用了一个名为 glyph_ui 的模块,该模块包含了 UI 界面的设计。接着,将 UI 界面中的 vtk_panel 窗口作为父窗口传递给 QGlyphViewer 类的构造函数,并将该类的实例化对象赋值给了 vtk_widget 变量。随后,创建了一个 QHBoxLayout 对象,并将 vtk_widget 添加到该布局中。接着,使用 setContentsMargins() 方法将 vtk_layout 的边距设置为0,并将 vtk_layout 添加到 vtk_panel 中,从而将 vtk_widget 添加到了 UI 界面中的 vtk_panel 中。最终,该方法实现了将 QGlyphViewer 类的实例化对象添加到了 UI 界面中。
这段代码没进 thing1()的原因 class Worker(QtCore.QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) # 设置工作状态与初始num数值 self.working = True self.num = 0 #def __del__(self): # 线程状态改变与线程终止 #self.working = False #self.wait() def stop(self): #线程状态改变与线程终止 self.working = False self.wait() def run(self): self.working = True while self.working == True: #file_str = 'File index{0}'.format(self.num) self.num += 1 # 发射信号 #self.sinOut.emit(file_str) self.sinOut.emit('1') # 线程休眠2秒 self.msleep(5) class parentWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.main_ui = JQ.Ui_MainWindow() self.main_ui.setupUi(self) self.thread1 = Worker() self.main_ui.pushButton_2.clicked.connect(self.thing1) self.thread1.sinOut.connect(self.printt) def thing1(self): #self.main_ui.pushButton.setEnabled(False) print('9999999999') self.thread1.start() self.thread1.wait() print('123') #self.sleep(2) def printt(self): print('7777') def ok(): print('ok') # def hourstest(): # thread1 = Worker() # thread1.start() # com = JQ.Ui_MainWindow().comboBox_2.currentText() # ser = serial.Serial('com3', 1200, timeout=1) # data = bytes.fromhex( # '68 01 00 20 00 00 00 00 00 34 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 F4 16 ') # ser.write(data) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QMainWindow() widget = parentWindow() ui = JQ.Ui_MainWindow() # 这是原py中的类,因人而异哦 ui.setupUi(widget) ui.discoverSerial() #串口发现 #ui.pushButton_2.clicked.connect(widget.thing1) widget.show() sys.exit(app.exec_())
在你的代码中,`thing1()` 函数中调用了 `self.thread1.wait()` 方法,这个方法会阻塞主线程,直到子线程执行完毕。因此,如果在 `thing1()` 中调用 `self.thread1.start()` 方法后立即调用 `self.thread1.wait()` 方法,那么子线程就没有机会执行 `run()` 方法,因为主线程一直在等待子线程执行完毕。
解决方法是在 `thing1()` 中删除 `self.thread1.wait()` 方法,让子线程在后台执行。同时,建议在 `Worker` 类的 `__del__()` 方法中加入线程终止的代码,以确保线程能够正确地退出。具体来说,可以将 `__del__()` 方法的注释部分取消注释,代码如下:
```python
class Worker(QtCore.QThread):
sinOut = pyqtSignal(str)
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
# 设置工作状态与初始num数值
self.working = True
self.num = 0
def __del__(self):
# 线程状态改变与线程终止
self.working = False
self.wait()
def stop(self):
#线程状态改变与线程终止
self.working = False
self.wait()
def run(self):
self.working = True
while self.working == True:
#file_str = 'File index{0}'.format(self.num)
self.num += 1
# 发射信号
#self.sinOut.emit(file_str)
self.sinOut.emit('1')
# 线程休眠2秒
self.msleep(5)
class parentWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.main_ui = JQ.Ui_MainWindow()
self.main_ui.setupUi(self)
self.thread1 = Worker()
self.main_ui.pushButton_2.clicked.connect(self.thing1)
self.thread1.sinOut.connect(self.printt)
def thing1(self):
#self.main_ui.pushButton.setEnabled(False)
print('9999999999')
self.thread1.start()
#self.thread1.wait() # 删除这行
print('123')
#self.sleep(2)
def printt(self):
print('7777')
def ok():
print('ok')
# def hourstest():
# thread1 = Worker()
# thread1.start()
# com = JQ.Ui_MainWindow().comboBox_2.currentText()
# ser = serial.Serial('com3', 1200, timeout=1)
# data = bytes.fromhex(
# '68 01 00 20 00 00 00 00 00 34 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 F4 16 ')
# ser.write(data)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
#widget = QtWidgets.QMainWindow() # 这行可删除
widget = parentWindow()
ui = JQ.Ui_MainWindow() # 这是原py中的类,因人而异哦
ui.setupUi(widget)
ui.discoverSerial() #串口发现
#ui.pushButton_2.clicked.connect(widget.thing1)
widget.show()
sys.exit(app.exec_())
```