当前位置: 首页 > news >正文

【Qt开发】创建并打开子窗口(QWidget)的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案

【Qt开发】创建并打开子窗口(QWidget)的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案

文章目录

  • 新建QWidget
    • 测试
    • 注意事项
      • 不要用多线程方式运行子窗口
      • 不要在打开子窗口后用阻塞死等
      • 不要用临时变量定义子窗口
  • 禁止其他窗口的点击
  • 隐藏窗口
  • 父窗口退出,但子窗口不退出解决方案
  • 附录:C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)
    • C语言与C++的不同
    • C++中写C语言代码
    • C语言到C++的知识点
    • Qt开发中需要了解的C++基础知识
      • namespace
      • 输入输出
      • 字符串类型
      • class类
        • 构造函数和析构函数(解析函数)
        • 类的继承

新建QWidget

选择新建文件
在这里插入图片描述
widget
在这里插入图片描述
配置名称
在这里插入图片描述

添加到项目
在这里插入图片描述
然后就会生成一系列子窗口文件
在这里插入图片描述
写法跟普通的窗口一样 也可以用ui等设计
在这里插入图片描述
打开窗口可以使用show()语句 但要提前将此窗口定义好
比如在父窗口下定义:

public:sonwindow *son;    

初始化:

this->son=new sonwindow;

按钮函数打开

    this->son->show();

测试

我们在子窗口上面建个按钮 用于打印线程编号
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以看到与主线程一致

注意事项

在其他GUI库中 比如Python的tkinter
如果我们不使用多线程打开子窗口 则会导致子窗口运行时 父窗口无法操作(子窗口阻塞)
而在Qt中 子窗口与父窗口都共用一个线程 由QApplication a(argc, argv);中的a.exec();执行
所以一些逻辑不一样 需要通过其他的配置来进行

不要用多线程方式运行子窗口

如果使用多线程 会有一系列的问题 非必要不使用

不要在打开子窗口后用阻塞死等

比如在子窗口后使用while(1) 会导致a.exec();无法执行 两个窗口卡死

不要用临时变量定义子窗口

如果使用临时变量 会导致打开子窗口函数返回后自动清空 导致子窗口被销毁
建议将其定义在父类下 或定义全局变量

禁止其他窗口的点击

在子窗口的构造函数里面 调用setWindowModality(Qt::ApplicationModal);
即可禁用其他窗口的点击

隐藏窗口

通过hide()语句可以隐藏其他窗口

父窗口退出,但子窗口不退出解决方案

在子窗口的构造函数里面 调用setAttribute(Qt::WA_QuitOnClose,false);
即可

附录:C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)

C语言与C++的不同

C语言是一门主要是面向工程的语言
C++则是面向对象

C语言中 某些功能实现起来较为繁琐
比如结构体定义:

一般写作:

typedef struct stu_A
{
}A;

也可以写作:

typedef struct 
{
}A;

但 大括号后面的名称是不可省去的

不过 C++的写法就比较简单
除了支持上述写法外

也支持直接声明

typedef struct A
{
}

另外 C++是完全支持C语言库和语法的
不过C++里面的库也有些很方便的高级功能用法 只不过实现起来可能不如C的速度快

再者 C语言与C++的编译流程不一样
C语言没有函数重载 所以给编译器传参就是直接传函数名称
但是C++除了传函数名称外 还会穿函数的参数、类型等等 以实现函数重载

C++中写C语言代码

上文提到 C++可以完全兼容C的写法
但是编译流程也还是不一样
所以如果在编译层面进行C语言代码编译 则通常用以下方法:

extern "C"
{
...
}

表面大括号内的内容用C的方法进行编译

另外 如果还是用C++的编译器 但要实现C语言函数 则需要用到C语言的库

在C语言中 我们一般用如下方法导入库

#include <stdio.h>

此方法同样适用于C++ 但是C++可以更方便的写成去掉.h的方式
比如:

#include <iostream>

在C++中 为了调用C语言的库 可以采用在原库名称前加一个"c"的方式导入
如:

#include <cstdio>

这样就可以使用printf等函数了 甚至比C++的std方法更快

C语言到C++的知识点

在这里插入图片描述

Qt开发中需要了解的C++基础知识

namespace

C++面向对象的特性下诞生的一个名称
表示某个函数、变量在某个集合下 用作namespace
比如 <iostream>库中的关键字cin在std下 则写作std::cin
std就是namespace
::表示某空间下的某某
前面是空间名称 后面是变量、函数名称

using namespace可以告诉编译器以下都用xx名称空间
比如:

using namespace std;
cout<<"a";

如果没有告诉编译器所使用的空间名称 则要写成:

std::cout<<"a";

同样 可以自定义某一段代码属于哪个空间:

namespace xx
{
...
}

输入输出

在C++中 用iostream作为输入输出流的库

#include <iostream>

用cin和cout关键字进行输入和输出
如:

using namespace std;
int a=0;
cin>>a; //输入到acout<<a;  //输出a

类比scanf和printf
同样 还有一个关键字endl表示换行
cout和cin的传参是不固定的
由编译器自行裁定

字符串类型

在C语言中 常用char *表示字符串
但是在C++中 可以直接用string类型
比如:

char * s="456";
string str="123";

由于cout的特性 这两种字符串都可以直接打印
但如果使用C语言中printf的打印方式时 采用%s方式打印字符串 则不能传入string类型

class类

C++的核心就是class
同Python等支持面向对象的语言一样
可以理解成一个支持函数、继承、自动初始化、销毁的结构体
在class类中 有private私有、public公有变量
前者只能内部访问 后者可以外部调用使用
如:

class A
{
public:
int a;
private:
int b;
}

a可以用A.a的方式方位 b则外部无法访问

构造函数和析构函数(解析函数)

构造函数可以理解成对类的初始化 反之析构函数则是退出时进行销毁前的函数
两者需要与类的名称相同 析构函数则在前面加一个~表示非
如:

class A
{
public:
int a;
A();
~A();
private:
int b;
}A::A()
{
...
}A::~A()
{
...
}

构造函数可以定义传参 析构函数则不行

类的继承

如果有两个类A和B 想让A里面包含B 则可以写作继承的写法
继承后 A类的变量可以直接调用B下面的成员
如:

class B
{
int b;
}
class A: public B
{
int a;
}

在定义A后 可以访问到B的成员b 当然 继承也可以私有

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TypeScript 快速上⼿ (2)
  • SiLM5932SHO系列SiLM5932SHOCG-DG 12A/12A强劲驱动电流能力 支持主动短路保护功能(ASC)单通道隔离门极驱动器
  • 电子电气架构---主流主机厂电子电气架构华山论剑(上)
  • 类和对象(3)
  • 论文阅读:Real-time Controllable Denoising for Image and Video
  • Kafka集群搭建的两种方式
  • Python之PyInstaller打包EXE程序(带音乐加图片等资源)
  • 微服务实战系列之玩转Docker(十)
  • 快速选型:9款高效人事薪酬管理工具推荐
  • Redis 集群三主三从配置
  • uniapp 中 web-view 向 App 传递消息
  • Excel设置根据A列是否符合某条件设置B列字体属性
  • OpenDDS的Rtps_Udp传输协议可靠性QoS收发基本流程
  • 关于Qt的系统总结
  • World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG
  • Computed property XXX was assigned to but it has no setter
  • es的写入过程
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript 一些 DOM 的知识点
  • Laravel核心解读--Facades
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mongodb--安装和初步使用教程
  • Mysql数据库的条件查询语句
  • pdf文件如何在线转换为jpg图片
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 第十八天-企业应用架构模式-基本模式
  • 分布式任务队列Celery
  • 官方解决所有 npm 全局安装权限问题
  • 区块链将重新定义世界
  • 如何进阶一名有竞争力的程序员?
  • 设计模式 开闭原则
  • 06-01 点餐小程序前台界面搭建
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #QT(QCharts绘制曲线)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (c语言+数据结构链表)项目:贪吃蛇
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)图像的%2线性拉伸
  • (转)c++ std::pair 与 std::make
  • ../depcomp: line 571: exec: g++: not found
  • .net 7和core版 SignalR
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 中的路径问题
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .netcore如何运行环境安装到Linux服务器
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET中winform传递参数至Url并获得返回值或文件