qt主窗口子窗口的问题

报错:
ensorflow.python.framework.errors_impl.InternalError,from device: CUDA_ERROR_OUT_OF_MEMORY
突然一个报错让我触不及防,原来是内存空间不足,莫名其妙也不查是哪个程序占用了,重启电脑更快解决。

然而过几天才发现,其实是自己qt里面代码写得有问题,虽然主窗口点击一个按钮,hide主窗口show子窗口,子窗口返回来也是hide子窗口show主窗口,但是这样其实是新建一个窗口,看起来是没什么变化,但是这里的窗口不是原来的是新建的是占用内存的。之前的那个窗口还在内存中,这样反复来回一个一个新建之后内存就没了,所以网上的例子还是要改的。再讨论完下面另一个问题再附上同样的解决办法

另一个问题:

(背景“我主窗口是加载keras的h5模型去预测图片的,子窗口是一个widget窗口用来显示label二维码的)

为什么子窗口返回主窗口时还要加载h5模型及权重,不是因为我代码判断写对了才会返回主窗口从而不用再次加载模型和权重,而是因为一开始run文件,主窗口加载了模型和权重一次,而且进入子窗口widget我是hide主窗口的所以内存里面保留了这个信息,返回主窗口一样hide子窗口,此时是新的窗口,再执行一次,内存里面两个相同信息,就存入了cache,cache是提高访问速率,简单理解是访问多了,存入cache,每次去cache读取,会比cpu去获取内存里面的东西快的多。所以子窗口返回来的第三次才不会卡。

解决的办法是在子窗口用主窗口的东西,主窗口也用子窗口的东西.

主函数的初始化(部分代码)

class MyWindow(QMainWindow, Ui_MainWindow):  
    def __init__(self, parent=None): 
	    self.dia = Ui_Dialog1()
	    self.dia.DoNotShow = True
	    self.dia.log4 = self     # 这一句是核心,让自己全部self赋值给子窗口的log4了,子窗口只要self.log4.XX就可以调用主窗口的self.XX值
	    
	    # 以下五句话是定时器15ms执行一次连接ShowCameraOneImage函数的一次截图
        self.capture = cv2.VideoCapture(0)
        self.DoNotShow = False
        self.timer_camera = QTimer()
        self.timer_camera.start(15)  # 1000ms == 1s
        self.timer_camera.timeout.connect(self.ShowCameraOneOneImage)  # 连接槽函数ShowCameraOneImage

主窗口的一个槽函数wechat(),点击了就进图子窗口代码那边了(PS:子窗口那边也是用了定时器)

def wechat(self):
    self.DoNotShow = True  #  为了避免进入子窗口后主窗口还在抓取显示图片
    self.capture.release() # 释放主窗口的cv2.VideoCapture(0)
    self.hide()		# 隐藏此主窗口

    self.dia.show()				# 显示子窗口
    self.dia.DoNotShow = False
    self.dia.capture = cv2.VideoCapture(0)  # 子窗口的cv2.VideoCapture(0)显示		

子窗口返回时候

    if(self.jj==1):   # 这个只是我代码的一个判断机制
        self.capture.release()  
        self.DoNotShow = True
        self.hide()  # 隐藏此子窗口
        
        self.log4.show()  			# 显示主窗口
        self.log4.DoNotShow = False
        self.log4.capture = cv2.VideoCapture(0)	# 释放子窗口的cv2.VideoCapture(0)
        
		self.jj = 0   # 这句以及下面的都是为了清空主窗口的textEdit,lineEdit_2的值
        self.log4.textEdit.setText("") 
        self.log4.textEdit_2.setText("")
        self.log4.textEdit_3.setText("")
        self.log4.lineEdit.setText("")
        self.log4.lineEdit_2.setText("")
        self.log4.sum_price = 0
        self.log4.k = 1

仔细观察,前六行是一样的。
解决方法就是如此,懂思路就好,如果退出程序进入要加载数据,那么还是pickle把数据或者变量保存到一个文件,进入窗口就加载。
学到了今天

### 实现主窗口打开窗口Qt 中实现从主窗口打开窗口的功能涉及多个方面,包括创建同类型的窗口以及设置信号和槽来管理这些窗口之间的交互。 #### 创建 MainWindow 类 为了启动应用程序并提供一个入口点,定义 `MainWindow` 类继承自 `QWidget` 或者更常见的 `QMainWindow`。这个类负责初始化界面组件,并处理用户触发的动作,比如按下按钮时打开新的对话框[^2]。 ```cpp // mainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "inputdialog.h" #include "displaywindow.h" class QPushButton; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); private slots: void openInputDialog(); private: InputDialog* inputDialog; }; #endif // MAINWINDOW_H // mainWindow.cpp #include "mainwindow.h" #include <QPushButton> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), inputDialog(new InputDialog(this)) { setWindowTitle(tr("Main Window")); QPushButton *openButton = new QPushButton(tr("&Open Dialog"), this); connect(openButton, SIGNAL(clicked()), SLOT(openInputDialog())); } ``` 上述代码展示了如何构建基本的主窗口结构,并通过连接按钮点击事件到特定的方法 (`openInputDialog`) 来响应用户的操作。 #### 打开窗口实例化过程 当用户点击按钮后,会调用 `openInputDialog()` 方法,在该方法内部可以创建一个新的窗口对象(例如 `InputDialog`),并通过其成员函数 `.exec()` 显示模态对话框;如果是非模态,则可以直接使用 `.show()` 函数[^1]。 ```cpp void MainWindow::openInputDialog(){ int result = inputDialog->exec(); // 对于模式对话框 // or simply call show() for non-modal dialog // inputDialog->show(); if(result == QDialog::Accepted){ qDebug()<<"User accepted the dialog"; } } ``` 这段代码说明了两种同的方式来呈现窗口——既可以是阻塞当前线程直到关闭为止的方式(`.exec()`),也可以是非阻塞式的(.show()). #### 窗口显示与隐藏逻辑 对于某些情况下希望仅改变现有窗口可见性的场合,可以在适当的地方调用相应的 API 如 .hide(), .setVisible(bool visible) 等来进行控制。另外一种情况是在父级窗口接收到鼠标单击消息之后判断光标所在位置是否位于某个特定区域之外从而决定要要让某几个窗口消失见[^5]: ```cpp if (event->button() == Qt::LeftButton) { // 检测窗口是否显示,如果显示并且点击位置在窗口外面则隐藏窗口 if (!setting_window.geometry().contains(mapFromGlobal(QCursor::pos())) && !setting_window.isHidden()){ setting_window.hide(); } } ``` 此片段实现了基于鼠标的动作自动调整窗口能见度的行为.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值