QT入门-基本控件

news2024/11/24 6:32:59

1.QTextEdit 

qt助手查看可知一些信息,其余信息见全文

1.1 functions 

 public function如下:

 使用时通过QT助手查找

实例:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTextEdit *edit = new QTextEdit(this);
    edit->resize(200,50);

    QPushButton *button = new QPushButton(this);
    QPushButton *input = new QPushButton(this);
    button->resize(100,50);
    button->move(50,100);
    button->setText("输出");

    input->resize(100,50);
    input->move(500,100);
    input->setText("输入");
    connect(button,&QPushButton::clicked,[=](){
        //后面一串是为了QString to const string 的转换
        qDebug()<<edit->toPlainText().toUtf8().data();
    });

    connect(input,&QPushButton::clicked,[=](){
        edit->setText("input context");
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

效果: 

1.2 signals 

2.QMainWindow

 QMainWindow是为用户提供界面的主窗口类,包含:

菜单栏(menubar),多个工具栏(toobar),多个铆接部件(dockwidgets浮动窗口),一个状态栏(status),及一个中心部件(centralwidget),是app的基础

eg:文本编辑器,图片编辑器等。

functions:

signals:

slots:
 

2.1 菜单栏(menubar)

 

代码如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTextEdit *edit = new QTextEdit(this);
    edit->resize(200,50);
    edit->move(50,50);
    QPushButton *button = new QPushButton(this);
    QPushButton *input = new QPushButton(this);
    button->resize(100,50);
    button->move(50,100);
    button->setText("输出");

    input->resize(100,50);
    input->move(500,100);
    input->setText("输入");
    connect(button,&QPushButton::clicked,[=](){
        //后面一串是为了QString to const string 的转换
        qDebug()<<edit->toPlainText().toUtf8().data();
    });

    connect(input,&QPushButton::clicked,[=](){
        //后面一串是为了QString to const string 的转换
        edit->setText("input context");
    });


    QMenuBar *bar = menuBar(); // 获取或创建菜单栏
    setMenuBar(bar); // 将菜单栏设置到窗口中

    // 创建“文件”菜单,并添加一些操作
    QMenu *fileBar = bar->addMenu("文件(&F)");

    fileBar->addAction("新建");
    fileBar->addAction("打开");
    fileBar->addAction("保存");
    fileBar->addSeparator(); // 添加一个分隔符

    // 创建一个子菜单 "最近访问的文件" 并添加一些文件项
    QMenu *last_file = fileBar->addMenu("最近访问的文件(&R)");
    last_file->addAction("1.txt");
    last_file->addAction("2.txt");
    last_file->addAction("3.txt");

    // 添加其他菜单
    bar->addMenu("编辑(&E)");
    bar->addMenu("View(&V)");
    bar->addMenu("格式(&M)");
}

效果: 

2.2 工具栏(QToolbar) 

 ​​​​​

  • 工具栏可以随意拖动的,可以放在软件左侧,上侧,下侧,右侧,甚至可以浮动在app的界面中。
  • 工具栏与菜单栏区别:菜单栏只能有一个,且在最上方;而工具栏可以有多个,并且位置多样。因此设置方式为addToolBar

代码如下:

...

    QToolBar *toolBar = new QToolBar(this);
    addToolBar(Qt::RightToolBarArea, toolBar);
    toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    //限制浮动(不限制可以在中间浮动)    
    toolBar->setFloatable(false);
    //限制拖拽
    toolBar->setMovable(true);

    QAction *newFile = new QAction("新建", this);
    QAction *openFile = new QAction("打开", this);
    QAction *saveFile = new QAction("保存", this);

    toolBar->addAction(newFile);
    //分割线
    toolBar->addSeparator();
    toolBar->addAction(openFile);
    toolBar->addSeparator();
    toolBar->addAction(saveFile);

 效果:

2.3添加状态栏(QStatusBar) 

代码如下:

...  
   // 设置状态栏
    QStatusBar *statusBar = new QStatusBar(this);
    setStatusBar(statusBar);

    // 创建三个标签,用于显示不同的信息
    QLabel *label1 = new QLabel(u8"人民币汇率:11"); // 使用UTF-8编码的字符串
    QLabel *label2 = new QLabel("美元汇率:11");     // 普通字符串
    QLabel *label3 = new QLabel(QStringLiteral("欧元汇率: 11")); // 使用QStringLiteral宏

    // 将标签添加到状态栏
    statusBar->addWidget(label1); // 添加到状态栏的左侧
    statusBar->addWidget(label2); // 也添加到状态栏的左侧
    statusBar->addPermanentWidget(label3); // 添加到状态栏的右侧,作为永久小部件

效果:

添加状态栏,由于系统的不同,以及中文和中文符号的数量为奇数个的时候易出现乱码

解决方式一,编辑里面重新设置编码规则, 并且有中文的地方前面全部加上u8,即可

 

解决方式二:使用QStringLiteral(),方法,因为内部是Lambda表达式实现,高频次调用影响性能

QLabel *label3 = new QLabel(QStringLiteral("欧元汇率: 11"));

2.4 铆接部件(dockWidget)

   ...
    // 创建停靠窗口
    QDockWidget *dockWidget = new QDockWidget(this);
    // 将停靠窗口添加到主窗口的左侧
    addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

 效果:

2.5 中心部件(centralWidget)

 

代码如下: 

...
        // 中心窗口设置为文本编辑器
        QTextEdit *textEdit = new QTextEdit(this);
        setCentralWidget(textEdit); // 设置文本编辑器为中心小部件

 效果:

3.UI设计器 

1.基本控件实现 

 1.拖动控件并通过设计器实现connect

2.菜单设置

设置完新的action后,直接拖动action到相应位置 

 2.Qt资源文件添加

资源添加分两种方式:

源码添加,和使用UI设计器添加,比如:一个QAction对象,对它添加图标,还是设置图标,添加代表可以多个,一般来说,一个工具,一个选项卡就是一个图标,因此,我们应该是设置图标,也就是设置icon,那么方法就是set开头,setIcon

1.源码添加方式 

   首先通过设计器设计action,然后使用setlcon添加

 ui->action->setIcon("填写路径"); 

2.UI设计器添加方式 

添加前提需要创建好Resource File,右键工程->add New->Qt->Qt Resource File,新建好工程资源文件,然后把图片资源放入其中 

创建好资源文件后,设置前置和添加图片资源,添加完资源后记得保存 

 

 

保存好,上步添加的资源后,打开UI设计器,我们往 “保存” 这个选项里面添加个icon选择好icon后,在UI设计器里面直接就能看到了 

 

 选择好icon后,在UI设计器里面直接就能看到了

如果添加完资源文件后,我们也可以用代码去访问资源

4.对话框

 虽然我们可以使用QDialog类进行自定义对话框的开发,但是Qt为了方便开发,提供了几种可复用的对话框类型,它们都继承自QDialog类。

Qt内置的对话框包括:

  • QColorDialog 选择颜色对话框
  • QFileDialog 选择文件或目录
  • QFontDialog 选择字体
  • QInputDialog 允许用户输入值,并将其返回
  • MessageBoxDialog 模态对话框,用于显示信息、咨询或警告等

1.QDialog 

 示例代码如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->actiona, &QAction::triggered, [=](){
        // 构建一个QDialog对象,并在lambda表达式中显示
        QDialog *dlg = new QDialog(this);
        dlg->resize(200, 100);
        dlg->setAttribute(Qt::WA_DeleteOnClose); // 对话框关闭时自动删除
        dlg->show(); // 显示对话框,但不阻塞其他窗口
        //dlg->exec(); // 显示对话框,阻塞其他窗口
        qDebug() << u8"弹出了,新建对话框";
    });
}

注意点1:

应该使用new在堆上创建变量,否则connect函数执行结束后,局部变量自动销毁了,如果使用非模态,那么程序继续运行,对话框就会转瞬即逝

QDialog *dlg = new QDialog(this);

注意点2:
 记得不用了就delete掉,这里由于无法判断什么时候不用对话框,因此使用setAttribute在对话框关闭时自动删除

dlg->setAttribute(Qt::WA_DeleteOnClose); // 对话框关闭时自动删除

注意点3:

  • 模态:用户交互阻塞在当前对话框
  • 非模态:用户可以跳开当前对话框,在别的对话框交互

 模态:

dlg->exec(); // 显示对话框,阻塞其他窗口

非模态:

dlg->show(); // 显示对话框,但不阻塞其他窗口

2.QMessage 

  • QMessageBox是模态对话框,在app中主要用来提供显示信息,弹出询问,警告等等。例如:我们在记事本中编辑文本,没有保存的时候,就点击关闭,那么app会弹出个QMessageBox对话框,来询问是否保存文本。
  • QMessageBox基于QDialog类的对话框

 

1.静态成员函数复习 

 在C++的类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。

  1. 静态成员函数可以通过类直接调用,而不一定必须通过实例化对象来调用。编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数
  2. 普通成员变量占用对象的内存,静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。
  3. 普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。
  4. 静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数).

2.QMessageBox的静态成员函数使用

QMessageBox静态成员函数如下: 

 

 对于一般的控件我们会这样使用,同时在合适的地方进行delete

    connect(ui->test_QMessageBox,&QPushButton::clicked,[=](){
        QMessageBox *msg = new QMessageBox;
        msg->information(this, "通知", "hello");
    });

 但是对于QMessageBox,我们使用的带的很多成员函数都是静态成员函数,因此没必要这样写,直接调用就行

    connect(ui->test_QMessageBox,&QPushButton::clicked,[=](){
//        QMessageBox *msg = new QMessageBox;
//        msg->information(this, "通知", "hello");
        QMessageBox::information(this, "通知", "hello");
    });

效果:
 

 3.正常成员函数

 这些成员函数的调用就要使用new进行,不能直接调用

3.QColorDialog

常用函数也位于静态区

示例代码如下:
 

...
    connect(ui->choose_color,&QPushButton::clicked,[=](){
        QColorDialog::getColor(Qt::red, this, "选择颜色");
    });

效果:

 4.QFileDialog

在Qt助手里面搜索QFileDialog,静态函数区,getOpenFileNamegetOpenFileNames这个就是我们获取文件路径+文件名的两个方法,对文件进行操作,我们只需要获取到路径+文件名即可,: 

静态区:

两个函数,一个不加s返回QString,另一个加s的函数返回一个QStringList,即,一个返回具体文件,一个返回文件列表。

static QString getOpenFileName(QWidget *parent = nullptr,
                                   const QString &caption = QString(),
                                   const QString &dir = QString(),
                                   const QString &filter = QString(),
                                   QString *selectedFilter = nullptr,
                                   Options options = Options());

对应五个参数:
父类:一般为this
caption:标题
dir:默认路径
selectedFilter:文件筛选,筛选显示后缀符合条件的文件
opthons:文件器,默认即可 

示例代码:

...    
    connect(ui->getfilename,&QPushButton::clicked,[=](){
        QFileDialog::getSaveFileName(this,"保存","C:\\","*.txt");
    });

 效果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1445181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第73左侧菜单实现

layout下面新建menu layout index.vue导入menu import Menu from /views/layout/menu菜单实现&#xff1a; <template><el-menuactive-text-color"#ffd04b"background-color"#2d3a4b"class"el-menu-vertical-demo"default-active&quo…

apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

C语言 服务器编程-日志系统

日志系统的实现 引言最简单的日志类 demo按天日志分类和超行日志分类日志信息分级同步和异步两种写入方式 引言 日志系统是通过文件来记录项目的 调试信息&#xff0c;运行状态&#xff0c;访问记录&#xff0c;产生的警告和错误的一个系统&#xff0c;是项目中非常重要的一部…

02.数据结构

一、链表 作用&#xff1a;用于写邻接表&#xff1b; 邻接表作用&#xff1a;用于存储图或树&#xff1b; 1、用数组模拟单链表 #include<iostream> using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示结点i的值 // ne[i] 表示结点i的ne…

python适配器模式开发实践

1. 什么是适配器设计模式&#xff1f; 适配器&#xff08;Adapter&#xff09;设计模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁&#xff0c;使得它们可以一起工作&#xff0c;而无需修改它们的源代码。 …

数字孪生:构建未来智慧社区的关键技术

随着科技的快速发展&#xff0c;数字孪生技术作为构建未来智慧社区的关键技术&#xff0c;正逐渐受到广泛关注。数字孪生技术能够实现物理世界与数字世界的交互映射&#xff0c;为智慧社区的建设提供强有力的支持。本文将探讨数字孪生技术在构建未来智慧社区中的作用和意义&…

蓝牙BLE学习

1. 简介 1.1 蓝牙发展历程 蓝牙&#xff0c;直接来自于一位国王的名字--King Harald ‘Bluetooth Gromsson。这位国王因两件事留名于史&#xff0c;其一是在公园958年统一了丹麦和挪威&#xff0c;其二是在其死后&#xff0c;其牙齿呈现出暗蓝色的颜色&#xff0c;因而得名蓝牙…

【Tauri】(1):使用Tauri1.5版本,进行桌面应用开发,在windows,linux进行桌面GUI应用程序开发,可以打包成功,使用 vite 最方便

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Pz421d7s4/ 【Tauri】&#xff08;1&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows&#xff0c;linux进行桌面GUI应用程序开发&#xff0c;可以打包成功&…

Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

文章目录 题目链接题意题解代码 题目链接 C. Digital Logarithm 题意 给两个长度位 n n n的数组 a a a、 b b b&#xff0c;一个操作 f f f 定义操作 f f f为&#xff0c; a [ i ] f ( a [ i ] ) a [ i ] a[i]f(a[i])a[i] a[i]f(a[i])a[i]的位数 求最少多少次操作可以使 …

电路设计(16)——纪念馆游客进出自动计数显示器proteus仿真

1.设计要求 设计、制作一个纪念馆游客进出自动计数显示器。 某县&#xff0c;有一个免费参观的“陶渊明故里纪念馆”&#xff0c;游客进出分道而行&#xff0c;如同地铁有确保单向通行的措施。在入口与出口处分别设有红外检测、声响、累加计数器装置&#xff0c;当游人进&#…

fast.ai 机器学习笔记(一)

机器学习 1&#xff1a;第 1 课 原文&#xff1a;medium.com/hiromi_suenaga/machine-learning-1-lesson-1-84a1dc2b5236 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这些笔记将继续更…

【蓝桥杯省赛真题23】python水仙花数 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python水仙花数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python水仙花数 第十二届蓝桥杯青少年组python比赛省赛真题 一、题目要求…

【ES6】模块化

nodejs遵循了CommonJs的模块化规范 导入 require() 导出 module.exports 模块化的好处&#xff1a; 模块化可以避免命名冲突的问题大家都遵循同样的模块化写代码&#xff0c;降低了沟通的成本&#xff0c;极大方便了各个模块之间的相互调用需要啥模块&#xff0c;调用就行 …

年底总结:野生码农与辉煌的2023

目录 始于兴趣终与坚持成于热爱2024 flag 始于兴趣 那是在遥远的2018年&#xff0c;我从机械行业跨入IT领域&#xff0c;当时觉得写代码非常酷的事&#xff0c;而且开发出来的功能可以提高机械制造效率&#xff0c;那种成就感油然而生。展望着未来&#xff0c;我觉得自己或许正…

8.【CPP】Vector(扩容问题||迭代器失效问题简述迭代器的种类)

vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的大小会被容器自…

大数据Doris(六十五):基于Apache Doris的数据中台2.0

文章目录 基于Apache Doris的数据中台2.0 一、​​​​​​​架构升级

117.乐理基础-五线谱-音值组合法(二)

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;116.乐理基础-五线谱-音值组合法&#xff08;一&#xff09;-CSDN博客 分母大于等于八的所有拍号的音值组合法&#xff0c;对于这些大于等于八的&#xff0c;可以用一句话来形容&#xff0c;那就是叫做&#xff0c…

骑砍战团MOD开发(44)-可编程渲染管线shader编程

一.可编程渲染管线 在GPU进行3D模型投射到2D平面过程中,渲染管线算法对开发者开放,目前支持的编程语言有OpenGL的ARB语言(pp文件),Direct3D的HLSL高级shader编程语言(fx文件). Direct3D提供一下API实现程序加载shader着色器文件: D3DXCreateEffectFromFile(gDevice,"fxfn…

使用 MinIO 超级充电 TileDB 引擎

MinIO 是一个强大的主要 TileDB 后端&#xff0c;因为两者都是为性能和规模而构建的。MinIO 是一个单一的 Go 二进制文件&#xff0c;可以在许多不同类型的云和本地环境中启动。它非常轻量级&#xff0c;但也具有复制和加密等功能&#xff0c;并且提供与各种应用程序的集成。Mi…

分享76个时间日期JS特效,总有一款适合您

分享76个时间日期JS特效&#xff0c;总有一款适合您 76个时间日期JS特效下载链接&#xff1a;https://pan.baidu.com/s/1s7tPGT_ItK7dNK5_qbZkug?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…