def click_pushButton_3(self): # 点击 pushButton_3 触发 框选图像 print("pushButton_3") self.label_1.setGeometry(QRect(20, 20, 400, 320)) hImg, wImg = self.img1.shape[:2] wLabel = self.label_1.width() hLabel = self.label_1.height() x0 = self.label_1.x0 * wImg // wLabel y0 = self.label_1.y0 * hImg // hLabel x1 = self.label_1.x1 * wImg // wLabel y1 = self.label_1.y1 * hImg // hLabel print("hImg,wImg=({},{}), x1,y1=({},{})".format(hImg, wImg, hLabel, wLabel)) print("x0,y0=({},{}), x1,y1=({},{})".format(x0, y0, x1, y1)) self.img2 = np.zeros((self.img1.shape), np.uint8) self.img2[y0:y1, x0:x1, :] = self.img1[y0:y1, x0:x1, :] print(self.img2.shape) self.refreshShow(self.img2, self.label_2) # 刷新显示 return 为什么我框选的图像没有在正中心
时间: 2024-04-27 12:24:50 浏览: 5
可能是因为 `self.label_1.setGeometry(QRect(20, 20, 400, 320))` 语句将 label_1 的位置设置为左上角坐标为 (20,20),大小为 400x320,而不是将其放置在中心位置。你可以尝试将该语句修改为 `self.label_1.setGeometry(QRect(0, 0, 400, 320))`,将其放置在中心位置。另外,你也可以通过计算 label_1 的位置将其放置在中心位置。
相关问题
@pyqtSlot() def on_pushButton_clicked(self): 槽函数可以用这样的形式来写吗
是的,你可以使用`@pyqtSlot()`装饰器来定义槽函数。这种形式的槽函数定义是Qt的一种推荐方式,特别是当你在Qt Designer中使用UI文件时,它可以帮助确保正确的信号与槽的连接。
以下是一个示例,展示了如何使用`@pyqtSlot()`装饰器定义槽函数:
```python
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.button = QPushButton('Click me')
self.button.clicked.connect(self.on_button_clicked)
@pyqtSlot()
def on_button_clicked(self):
# 在这里编写按钮点击后要执行的代码
print('Button clicked!')
if __name__ == '__main__':
app = QApplication([])
window = MyWindow()
window.show()
app.exec_()
```
在这个示例中,`on_button_clicked`方法被使用`@pyqtSlot()`装饰器修饰,表示它是一个槽函数。当按钮被点击时,`on_button_clicked`方法会被调用,输出"Button clicked!"。
注意,使用`@pyqtSlot()`装饰器是可选的。如果你没有使用装饰器,槽函数的定义也是有效的。但是,在某些情况下(如使用UI文件),使用装饰器可以帮助确保正确的信号与槽连接。
self.pushButton_show3D.clicked.connect(self.show_3D)多线程
如果你需要在点击 `pushButton_show3D` 按钮后启动一个耗时的任务,可以使用多线程来避免阻塞主线程。以下是一个简单的例子:
```python
from PyQt5.QtCore import QThread, pyqtSignal
class TaskThread(QThread):
finished = pyqtSignal(object)
def __init__(self):
super().__init__()
def run(self):
# 在这里执行耗时的任务
result = compute_3D_data()
# 发送任务完成的信号,将结果传递给主线程
self.finished.emit(result)
```
在主窗口中,你需要将 `TaskThread` 实例化并连接到按钮的 `clicked` 信号上:
```python
self.thread = TaskThread()
self.thread.finished.connect(self.show_3D)
self.pushButton_show3D.clicked.connect(self.thread.start)
```
在 `TaskThread` 的 `run` 方法中执行的任务会在一个独立的线程中运行,不会阻塞主线程。当任务完成后,会发送一个 `finished` 信号,将结果传递给 `show_3D` 方法,该方法会在主线程中执行,用于更新UI界面。