Qt学习第二篇(基本小组件的使用)

news/2024/11/18 7:33:49/文章来源:https://www.cnblogs.com/ivanlee717/p/18199519

Qt_2

小部件是 GUI 的基本元素。 它也称为UI 控件。 它接受来自底层平台的不同用户事件,如鼠标和键盘事件(以及其他事件)。 我们使用不同的小部件创建 UI。 曾经有一段时间,所有的 GUI 控件都是从头开始编写的。 Qt 小部件通过开发具有现成的 GUI 控件的桌面 GUI 来缩短时间,并且 Qt 广泛使用继承的概念。 所有小工具都继承自QObjectQWidget是一个基本小部件,是所有 UI 小部件的基类。 它包含描述小部件所需的大多数属性,以及几何图形、颜色、鼠标、键盘行为、工具提示等属性。 让我们看看下图中的QWidget继承层次结构:

image-20240506212733775

大多数 Qt 小部件名称都是不言而喻的,因为它们以q开头,所以很容易识别。 下面列出了其中的一些内容:

  • QPushButton是用于命令应用执行某个操作。
  • QCheckBox允许用户做出二元选择。
  • QRadioButton允许用户从一组互斥选项中仅选择一个。
  • QFrame显示帧。
  • QLabel用于显示文本或图像。
  • QLineEdit允许用户输入和编辑单行纯文本。
  • QTabWidget用于显示与选项卡式小部件堆栈中的每个选项卡相关的页面。

使用 Qt 小部件的优势之一是它的育儿系统。 从QObject继承的任何对象都具有父子关系。 这种关系给开发人员带来了很多便利,例如:

  • 当小部件被销毁时,由于父子层次结构,它的所有子部件也会被销毁。 这避免了内存泄漏。
  • 您可以使用findChild()findChildren()查找给定QWidget类的子类。
  • Qwidget中的子构件自动出现在父构件内部。

典型的 C++ 程序在 Main 返回时终止,但在 GUI 应用中我们不能这样做,否则应用将无法使用。 因此,我们需要 GUI 一直存在,直到用户关闭窗口。 要实现这一点,程序应该循环运行,直到发生这种情况。 GUI 应用等待用户输入事件。

#include "mainwindow.h"#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QLabel myLabel;myLabel.setText("I love regina");//MainWindow w;myLabel.show();return a.exec();
}

image-20240506213446849

接下来挨个实现一下前面的基础模块的使用方式:

QPushButton

#include "mainwindow.h"#include <QApplication>
#include <QLabel>
#include <QPushButton>void mySlot() {qDebug() << "regina kissed!";/*qDebug() 是 Qt 框架中用于调试输出的函数,它用于将调试信息输出到控制台。在你的示例中,mySlot() 是一个槽函数,用于处理按钮点击事件。在槽函数中调用 qDebug() 是一种常见的做法,可以在控制台输出一些调试信息,以便于开发人员调试和排查问题。*/
}
int main(int argc, char *argv[])
{QApplication a(argc, argv);QPushButton *mybutton = new QPushButton("click my sister regina");// 将按钮的点击事件连接到槽函数QObject::connect(mybutton,&QPushButton::clicked,&mySlot);/*mybutton 是发出信号的对象,也就是 QPushButton 对象。&QPushButton::clicked 是要连接的信号,表示当按钮被点击时发出的信号。&mySlot 是槽函数的地址,表示当按钮被点击时要调用的函数。*/mybutton->show();return a.exec();
}

image-20240506214739368

QCheckBox

#include "mainwindow.h"#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QCheckBox>
#include <QVBoxLayout>
void mySlot() {qDebug() << "regina kissed!";
}
int main(int argc, char *argv[])
{QApplication a(argc, argv);/*QLabel myLabel;myLabel.setText("I love regina");//MainWindow w;myLabel.show();*/QPushButton *mybutton = new QPushButton("click my sister regina");// 将按钮的点击事件连接到槽函数QObject::connect(mybutton,&QPushButton::clicked,&mySlot);/*mybutton 是发出信号的对象,也就是 QPushButton 对象。&QPushButton::clicked 是要连接的信号,表示当按钮被点击时发出的信号。&mySlot 是槽函数的地址,表示当按钮被点击时要调用的函数。*/QWidget *widget = new QWidget;QVBoxLayout *layout = new QVBoxLayout(widget); //创建垂直布局管理器QCheckBox *checkBox = new QCheckBox("kiss regina", widget);checkBox->setChecked(false);//默认为不选layout->addWidget(checkBox);layout->addWidget(mybutton);widget->setLayout(layout);widget->show();//mybutton->show();return a.exec();
}

image-20240513223406067

QRadioButton

QRadioButton *radioButton = new QRadioButton("Radio Button Text", widget);
//获取和设置选中状态
bool ischecked = radioButton->isChecked();
radioButton->setChecked(true);

image-20240514221632736

QFrame

  • 创建帧:QFrame *frame = new QFrame(parent);
  • 设置帧的样式和属性:frame->setFrameShape(QFrame::Box);, frame->setFrameShadow(QFrame::Sunken);

QFrame 类用于创建框架,可以在界面中用作容器或用于装饰其他小部件。setFrameShape()setFrameShadow()QFrame 类的两个方法,分别用于设置框架的形状和阴影效果。除了这两个方法之外,QFrame 类还有其他一些属性可以设置,例如:

  1. setLineWidth(int width):设置框架的线宽度。
  2. setMidLineWidth(int width):设置框架中间线的宽度(当框架形状为 QFrame::StyledPanel 时可见)。
  3. setFrameStyle(int style):设置框架的风格,可以使用 QFrame:: 前缀的常量来指定不同的风格。
  4. setFrameRect(const QRect &rect):设置框架的矩形区域。
  5. setAutoFillBackground(bool enabled):设置是否自动填充背景。
  6. setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical):设置框架的大小策略。
  7. setContentsMargins(int left, int top, int right, int bottom):设置框架内部内容的边距。
QFrame *frame = new QFrame(widget);
frame->setFrameShape(QFrame::Panel);
frame->setFrameShadow(QFrame::Raised);
frame->setLayout(layout);

image-20240514230415185

QLabel

    QLabel *label = new QLabel("label text",widget);label->setText("regina label");label->setPixmap(QPixmap("D:\\厦门Day2\\IMG_0958.JPG"));layout->addWidget(label);

QLineEdit

QLineEdit 是 Qt 框架中提供的一个用于输入和编辑单行文本的小部件(widget)。它允许用户在一个单行的文本框中输入、编辑和获取文本内容。

使用 QLineEdit,你可以创建一个单行编辑框,用户可以在其中输入文本。可以通过调用 setText() 方法来设置初始文本内容,并通过调用 text() 方法来获取当前文本内容。

// 创建单行编辑框
QLineEdit *lineEdit = new QLineEdit(widget);// 获取和设置文本内容
QString text = lineEdit->text(); // 获取文本内容
lineEdit->setText("regina linetext"); // 设置文本内容
//layout->addWidget(frame);
layout->addWidget(lineEdit);

image-20240518160547019

以下是 QLineEdit 的几个常用方法:

  • setText(const QString &text): 设置文本内容。
  • text() const: 获取当前文本内容。
  • setPlaceholderText(const QString &text): 设置占位文本,显示在用户未输入任何内容时的灰色提示文字。
  • setReadOnly(bool readOnly): 设置是否为只读模式,如果设置为 true,则用户无法编辑文本。
  • clear(): 清除文本内容。

此外,你还可以通过信号和槽机制来处理文本的变化和编辑事件,以及使用样式表来自定义 QLineEdit 的外观。

以下是一个用例:

#include <QApplication>
#include <QLineEdit>
#include <QDebug>
#include <QVBoxLayout>
int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建一个窗口QWidget window;  //QWidget *widget = new QWidget;window.setWindowTitle("qLINE"); //widget->setWindowTitle("qLINE");// 创建一个单行编辑框QLineEdit *lineEdit = new QLineEdit(&window);//这里必须是引用//QLineEdit *lineEdit = new QLineEdit(widget);lineEdit->setPlaceholderText("请输入内容");// 设置只读模式lineEdit->setReadOnly(false);// 设置为 true,则用户无法编辑文本// 设置初始文本内容lineEdit->setText("初始文本");// 清除文本内容// lineEdit->clear();// 连接信号与槽函数,当文本发生变化时触发QObject::connect(lineEdit,&QLineEdit::textChanged,[&](){QString text = lineEdit->text();qDebug() << "文本已改变:" << text;});// 将单行编辑框添加到窗口中window.setLayout(new QVBoxLayout);window.layout()->addWidget(lineEdit);//QVBoxLayout layout;//layout.addWidget(lineEdit);//widget.setLayout(layout);// 显示窗口window.show();// 运行应用程序return app.exec();
}

image-20240518165902894

image-20240518165931928

image-20240518165956547

QTabWidget

QTabWidget 是 Qt 框架中的一个部件(widget),用于创建具有选项卡(tab)界面的容器。它提供了一种将多个页面组织在一起并以选项卡的形式进行切换的方式。

QTabWidget *tabWidget = new QTabWidget(widget);// 创建选项卡小部件
// 创建选项卡页面 1
QWidget *page1 = new QWidget();
QVBoxLayout *page1Layout = new QVBoxLayout(page1);
page1Layout->addWidget(new QPushButton("Button 1"));
page1Layout->addWidget(new QPushButton("Button 2"));// 创建选项卡页面 2
QWidget *page2 = new QWidget();
QVBoxLayout *page2Layout = new QVBoxLayout(page2);
page2Layout->addWidget(new QPushButton("Button 3"));
page2Layout->addWidget(new QPushButton("Button 4"));
// 将选项卡页面添加到 QTabWidget
tabWidget->addTab(page1, "Tab 1");
tabWidget->addTab(page2, "Tab 2");
layout->addWidget(tabWidget);

image-20240518171131811

image-20240518171140247

基本的组件使用就讲到这里,剩下的遇到了再积累。之后介绍深层次的自定义部件,信号槽函数使用的原理等内容。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Weblogic T3反序列化漏洞(CVE-2018-2628)

在Weblogic中RMI通信的实现是使用T3协议,并且在T3的传输过程中,和RMI一样,会进行序列化和反序列化的操作。目录前言T3协议概述漏洞复现修复方案 前言 WebLogic Server 是一个企业级的应用服务器,由Oracle公司开发,支持完整的Java EE规范,包括EJB、JSP、Servlet、JMS等,适…

方方方的数据结构

总算给我看懂到底是什么意思了。。。 首先我们来考虑按照时间+扫描线进行处理,假设操作如下黑色是加操作,黄色是乘操作,绿色是加操作,对于红色那条线所代表的点,随着时间的流逝,首先在刚刚进入黑色的时候,这一点的值就被加上了一个数,然后刚刚进入黄色的时候,这一点的…

手机硬件检测:-DeviceTest

手机硬件检测:Z-DeviceTest官方版是款针对手机硬件所打造的检测工具。手机硬件检测:Z-DeviceTest能够检测硬件和OS,硬件上不仅仅是电池、cpu、内存、OS,甚至连usb、扬声器、指南针、摄像头、GPS、听筒等都能检测。并且手机硬件检测:Z-DeviceTest还能够对市面众多的机型进行检…

OutOfMemoryError

以下的这段代码应该是报错的才对,但是我在运行了之后,程序一直卡在那里。最后请教老师了解到,原来jvm如果不指定运行参数,是会进行自动扩容的。 package com.coding.jvm.oom;public class NativeErrorDemo {public static void main(String[] args) {for (; ; ) {new Threa…

【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码

1 前言 电脑重置了或者新的项目代码,仓库里二三十个,一个一个拉属实有点拉跨,今儿空了整了个脚本,可以拉下所有的仓库代码。 2 前置 需要装一个解析 json的,windows 的话可以直接下载:下载,mac的话可以再官网下载:官网地址。 然后加入到 PATH 下,效果如下:3 脚本 …

app测试工具monkey

Monkey是Android中的一个命令行工具,可以运行在模拟器或者实际设备中向系统发送伪随机的用户事件流(按键输入、触摸屏输入、手势输入等) 实现对正在开发的应用程序进行测试; Monkey测试之一种为了测试软件的稳定性、健壮性的快速有效的方式 一、什么是Monkey 顾名思义,M…

Markdown的学习笔记

Markdown (#+空格输入后回车自动形成大标题) 字体 (##+空格输入回车形成二级标题,以此类推,最多6级) hello world!(两边加两个*好为粗体) hello world!(两边一个*号为斜体) hello world!(三个*号斜体加粗) hello world!(两边两个~号删除线) 引用(大于>+空格形…

关于idea部署本地项目的问题

因为我部署问题的时忘记把问题截图,所以我这边使用网上的截图。 这个错误信息表明,你正在尝试运行一个由更高版本的Java编译的Spring Boot应用程序,而你当前使用的Java运行时(JRE)版本过低,无法识别这个应用程序的类文件版本。 它这边提示应用程序中的类文件版本是61.0,…

GmSSL3.X编译iOS和Android动态库

一、环境准备 我用的Mac电脑编译,Xcode版本15.2,安卓的NDK版本是android-ndk-r21e。 1.1、下载国密源码 下载最新的国密SDK源码到本地。 1.2、安装Xcode 前往Mac系统的AppStore下载安装最新Xcode。 1.3、安卓NDK下载 下载NDK到本地,选择一个比较新的版本下载即可,我选择的是…

实验31-hanlp_textrank

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6

关于cmd运行javac提示javac 不是内部或外部命令,也不是可运行的程序的问题

大家可以看到我这边cmd运行javac命令,它对我进行了错误的提示,提示javac不是可运行命令和程序。这个问题的根本在于环境变量的配置出现了错误。 接下来就要进行jdk的环境配置了。 注意点:这里要定位到自身存放jdk的bin目录才会生效。点击确定即可,然后打开cmd窗口输入java…

[SWPUCTF 2016]Web7 利用ssrf攻击redis

今天做了一道攻击redis的相关题目,以前没接触过。 初始界面有输入框,随便输入看看。是urllib2相关库报错,去搜了搜发现是Python2的Urllib2头部注入(CVE-2016-5699)。那就看看这个cve。说是Python2.x 3.x的urllib/urllib2从数据解析到发包的整个流程中,均未对URL提供安全性过…