QT笔记(节选)具体图片等下载资源

news2024/11/20 1:25:08

QT笔记(节选)具体图片等下载资源

根据b站视频做的笔记:
https://www.bilibili.com/video/BV1g4411H78N?p=44&spm_id_from=pageDriver&vd_source=a3e6a48ccd3d7d1f969f662653ed68c9

qt是一个跨平台的c++图形用户界面应用程序框架,界面引擎。

下载地址:

https://www.qt.io/download-open-source

https://download.qt.io/

优点:

1.跨平台

2.接口简单,容易上手

3.一定程度上简化了内存回收

成功案例:

谷歌地图,多媒体播放器

程序规范

命名规范:

​ 1.类名:首字母大写,单词和单词之间收字母大写

​ 2.函数名\变量名:首字母小写,单词和单词之间首字母大写

快捷键:

​ 1.注释:ctrl+ /

​ 2.运行:ctrl + r

​ 3.编译:ctrl + b

​ 4.字体缩放: ctrl + 鼠标滚轮

​ 5.查找:ctrl + f

​ 6.帮助文档: f1

​ 7.自动对齐:ctrl + i

​ 8.同名之间的.h和.cpp之间切换:f4

创建一个qt程序(QWidget)

1.点击新建程序:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.选择正确的项目创建

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

qmake和cmake两者都用来构建系统,都生成一个Makefile,该文件由make读取以构建项目,告诉编译器和链接器该做什么,以创建可执行文件(或动态或静态库)。

    qmake专注于使用Qt的项目,QtCreator可以轻松生成项目文件(适合初学者),并由QtCreator支持;CMake用于广泛的项目,支持多种平台和语言,受多个IDE支持:例如QtCreator,Visual Studio,生成多个IDE的项目描述,包含简化Qt使用的命令(最重要:automoc)。如果项目使用Qt,则最好使用qmake。 CMake更通用,几乎适合任何类型的项目。
    如果项目使用Qt,但又不想使用qmake,则必须自己做一些事情:运行元对象编译器(MOC),包含路径(告诉编译器在哪里寻找Qt标头),链接(告诉链接器在哪里寻找Qt库)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QWidget是窗口函数,是QMainWindow和QDialog的父类。

QMainWindow和QDialog比QWidget包含更多功能函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果此处没有可选的kit,是因为安装qt时默认没有安装这些组件。需要卸载重装,重装时勾选相应的组件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

git是用于多版本控制,可以用于多人开发。

用户a使用git push命令推送写的代码到线上,用户b可以通过git pull命令将a的代码拉取到本地做二次开发,达到协作开发的目的。

git相关命令可以查看这个博文:

https://blog.csdn.net/Eoneanyna/article/details/134971873?spm=1001.2014.3001.5501

创建成功后的文件目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

//main.cpp
#include <QApplication>//包含一个应用程序类的头文件
#include "widget.h"

//main程序入口,argc命令变量的数量,argv命令行变量的数组
int main(int argc, char *argv[])
{
    //应用程序对象,在qt中,应用程序对象有且只有一个
    QApplication a(argc, argv);

    QTranslator translator;
    const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "gold_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            a.installTranslator(&translator);
            break;
        }
    }
    //窗口对象 widget的父类-》QWidget
    Widget w;
    //窗口对象显示。默认不会显示,必须调用show方法显示窗口
    w.show();

    //让应用程序对象进入消息循环
    /*
       while(true){
        if(点击×){
        break;
        }
    }
    */
    return a.exec();
}

//widget.h
#ifndef WIDGET_H
#define WIDGET_H
//ifndef跟#pragma once一样的意思,
//如果不存在头文件名则定义一个

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
## 程序.pro文件

#qt包含的模块 gui图形模块
QT       += core gui
#大于4版本以上,包含widget模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

#指定生成的目标应用程序名称,如test.exe
#TARGET = test
#TEMPLATE = app//模板 应用程序模板 application
#lib -建立一个库的makefile
#vcapp -建立一个应用程序的vs项目文件
#vclib -建立一个库的vs项目文件
#subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并为一个项目文件生成makefile,并调用make的makefile

#源文件
SOURCES += \
    main.cpp \
    widget.cpp

#头文件
HEADERS += \
    widget.h

#
FORMS += \
    widget.ui

TRANSLATIONS += \
    gold_zh_CN.ts
CONFIG += lrelease
CONFIG += embed_translations

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

其中:

QT += core gui

qt有以下的模块:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在帮助文档中,有对应的类属于哪个模块的说明,如:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建一个按钮

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    //创建一个按钮
    QPushButton * btn = new QPushButton;
    //让按钮对象在父框图内
    btn->setParent(this);
    //按钮显示的文本
    btn->setText("这是按钮");

    //创建第二个按钮,按照控件的大小创建窗口
     QPushButton * btn1 = new QPushButton("button2",this);

     //移动btn1的位置
     //x以右为正方向
     //y以下为正方向
     btn1->move(100,100);
     
     //重置窗口的大小
     resize(600,400);


    ui->setupUi(this);
}

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



效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按钮文本设置报错

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按钮设置文本时报错,发现是中文太长了,删除几个字之后就可以正常跑了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

中文乱码解决

设置文本为UTF-8

点击 工具-》》选项

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按钮重新指定大小

     //重新设置btn1的大小
     btn1->resize(200,70);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置窗口标题

//设置窗口标题
setWindowTitle("翻金");

窗口标题设置失败

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是由于 ui->setupUi(this);这一行

设置了ui界面的一些默认规则。

可以将标题代码放到这一行后面,或者注释掉这一行都可以。

效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击按钮关闭窗图

connect(信号的发送者,发送的具体信号,信号的接收者,信号的处理(槽函数))

槽函数的优点:松散的耦合,信号发送端和接收端通过connect连接在一起

//实际使用
    //创建第二个按钮,按照控件的大小创建窗口
     QPushButton * btn1 = new QPushButton("button2",this);

//如果发射者与接收者属于同一个对象的话,那么在 connect 调用中接收者参数可以省略。
connect(btn1,&QPushButton::clicked,this,&Widget::close);
//或者
//connect(btn1,&QPushButton::clicked,this,&QWidget::close);

自定义的信号和槽

信号关键字

signals:

自定义信号,写到signals下 返回值是void,只需要定义声明,不需要实现。 可以有参数,可以重载

槽函数关键字:

slots:

  • public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
  • protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。
  • private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。

注意:

一个信号可以连接多个槽函数

多个信号可以连接同一个槽函数

绑定的信号和槽函数的参数类型必须对应;信号的参数个数可以多于槽函数的参数个数,但不可以少于槽函数的参数个数

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    
signals:
    void hungry();
    void hungry(int);
    
public:
    //早期的qt版本必须写public slots
    //高级版本可以写到public下
    //返回值void ,需要声明,需要实现
    //可以有参数,可以重载
    void treat();
};

     
     //发出信号
     emit this->hungry();
     
     //
     connect()
connect的使用

connect可以对信号进行关联

//如:
connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) );
//当信号 clicked() 被发射时,信号 aSignal() 也接着被发射。
//第三个参数,接受者是this时,可以被省略

当槽发生重载时:

 //连接带参数的信号和槽
 void(Widget:: *hungrySignal)(int) = &Widget::hungry;
 void(Widget:: *treatFunc)(int) = &Widget::treat;
 
 connect(this,hungrySignal,this,treatFunc);
disconnect取消关联

当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下:

bool QObject::disconnect ( const QObject * sender, const char * signal,
   const Object * receiver, const char * member ) [static]

在 disconnect 函数中 0 可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者 sender 不能为 0,其它三个参数的值可以等于 0。

1、断开与某个对象相关联的任何对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或者多个信号,这些信号与另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就可以利用这个方法,非常之简洁。

disconnect( myObject, 0, 0, 0 )
或者
myObject->disconnect()

2、断开与某个特定信号的任何关联。

disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
或者
 myObject->disconnect( SIGNAL(mySignal()) )

3、断开两个对象之间的关联。

disconnect( myObject, 0, myReceiver, 0 )
或者
myObject->disconnect(  myReceiver )
emit 关键字

Newspaper类的send()函数比较简单,只有一个语句emit newPaper(m_name);。emit 是 Qt 对 C++ 的扩展,是一个关键字(其实也是一个宏)。emit 的含义是发出,也就是发出newPaper()信号。感兴趣的接收者会关注这个信号,可能还需要知道是哪份报纸发出的信号?所以,我们将实际的报纸名字m_name当做参数传给这个信号。当接收者连接这个信号时,就可以通过槽函数获得实际值。这样就完成了数据从发出者到接收者的一个转移。

void Widget::sing(){
       //发出信号
     emit this->hungry(1);
}
qt4之前的信号和槽连接方式
connect(this,SIGNAL(hungry()),this,SLOT(treat()));
//qt4的优点:参数直观
//缺点:类型不做检测,编译时不会做错误检查

//底层SINGNAL("hungry") SLOT("treat") 用函数名去查找

对象树

在上一节的按钮中new的对象无须释放,是因为按钮的父类Qobject是以对象树的形式组织起来的。

在创建QObject对象在堆区时,会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中所有对象也会被析构(注意,这里的父对象并不是继承意义上的父类)

    //创建一个按钮
    QPushButton * btn = new QPushButton;
    
    //让按钮对象在父框图内
    btn->setParent(this);
    //这句就是设置btn的按钮有this这个父对象

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Lambda表达式(匿名函数)

c++11中的lambda表达式用于定义并创建匿名的函数对象,以简化编程工作

[函数对象参数](操作符重载函数参数)mutable->返回值{
	函数体
}

函数对象参数:标志一个lambda的开始,不能省略

  • 。没有使用任何函数对象参数

  • =函数体内可以使用lambda所在作用范围内所有可见的局部变量(报考lambda所在类的this),并且是值传递方式

  • & :函数体内可以使用Lambda所在作用范围内所有可见的局部变量

  • this:可以使用lambda所在类中的成员变量

  • a:将变量a按值进行传递,函数体内不能修改传递进来的a值,因为默认情况下函数是const的,要修改传递进来的a的拷贝,可以添加mutable修饰符

    [m]()mutable{
    	m=10;
    };
    
  • &a:变量a的引用

  • a,&b,a按值进行传递,b按引用进行传递

  • =,&a,&b除ab按引用进行传递外,其他参数按照值进行传递

  • &,a,b除ab按照值传递外,其他参数按照引用进行传递

有返回值的匿名函数

int ret = []()->int{
	return 100;
};

课外小demo

写一个匿名槽函数,点击open变按钮为close,点击close变为open

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
	//创建一个按钮
    QPushButton * btn = new QPushButton;
    //让按钮对象在父框图内
    btn->setParent(this);
    //按钮显示的文本
    btn->setText("open");
    connect(btn,&QPushButton::clicked,this,[=](){
        if(btn->text() == (QString)"open"){
                btn->setText("close");
        }else{
            btn->setText("open");
        }
    });
  }

写一个匿名槽函数,点击open打开第二个窗口,点击close关闭第二个窗口

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
	//创建一个按钮
    QPushButton * btn = new QPushButton;
    //让按钮对象在父框图内
    btn->setParent(this);
    //按钮显示的文本
    btn->setText("open");
	QPushButton * Nbtn = new QPushButton;
    connect(btn,&QPushButton::clicked,this,[=](){
        if(btn->text() == (QString)"open"){
                 Nbtn->show();
                 btn->setText("close");
        }else{
            btn->setText("open");
            Nbtn->close();
        }
    });
  }

QMainWindow

QmainWindow是一个为用户提供主窗口程序的类,包含菜单栏,工具栏、多个链接部件、一个状态栏以及一个中心部件。是许多应用程序的基础,如文本编辑器,图片编辑器等

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include<QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   //重置窗口大小
   resize(600,400);
   //菜单栏创建,最多只能有一个
   QMenuBar *bar = menuBar();
   //把菜单栏放入窗口
   setMenuBar(bar);

   //添加菜单栏内容
   //创建菜单
   QMenu *fileMenu = bar->addMenu("文件");
   QMenu *editMenu = bar->addMenu("编辑");
  //创建菜单项
  QAction * newAction = fileMenu->addAction("新建");
  //添加分割线
  fileMenu->addSeparator();
  fileMenu->addAction("打开");

  //工具栏,可以有多个
  QToolBar *toolBar = new QToolBar(this);
  addToolBar(Qt::LeftToolBarArea,toolBar);
  //设置只允许左右停靠
  toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
  //设置工具栏浮动,默认是开启的现在设置关闭
  toolBar->setFloatable(false);
  //设置工具栏移动(总开关)
  toolBar->setMovable(false);
  //工具栏中设置内容
  toolBar->addAction("钢笔");
  //添加分割线
  toolBar->addSeparator();
  //在工具栏中设置菜单栏的内容
  toolBar->addAction(newAction);
  //在工具栏中添加按钮的控件
  QPushButton *btn = new QPushButton("按钮",this);
  toolBar->addWidget(btn);
}

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


效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加状态栏、浮动窗口、中心编辑器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include<QPushButton>
#include<QLabel>
#include<QDockWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   //重置窗口大小
   resize(600,400);
   //菜单栏创建,最多只能有一个
   QMenuBar *bar = menuBar();
   //把菜单栏放入窗口
   setMenuBar(bar);

   //添加菜单栏内容
   //创建菜单
   QMenu *fileMenu = bar->addMenu("文件");
   QMenu *editMenu = bar->addMenu("编辑");
  //创建菜单项
  QAction * newAction = fileMenu->addAction("新建");
  //添加分割线
  fileMenu->addSeparator();
  fileMenu->addAction("打开");

  //工具栏,可以有多个
  QToolBar *toolBar = new QToolBar(this);
  addToolBar(Qt::LeftToolBarArea,toolBar);
  //设置只允许左右停靠
  toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
  //设置工具栏浮动,默认是开启的现在设置关闭
  toolBar->setFloatable(false);
  //设置工具栏移动(总开关)
  toolBar->setMovable(false);
  //工具栏中设置内容
  toolBar->addAction("钢笔");
  //添加分割线
  toolBar->addSeparator();
  //在工具栏中设置菜单栏的内容
  toolBar->addAction(newAction);
  //在工具栏中添加按钮的控件
  QPushButton *btn = new QPushButton("按钮",this);
  toolBar->addWidget(btn);

  //状态栏,最多有一个
  QStatusBar *stBar = statusBar();
  //设置到窗口中
  setStatusBar(stBar);
  //放标签控件(默认左侧)
  QLabel *label = new QLabel("提示信息",this);
  stBar->addWidget(label);
  //右侧存放
  QLabel *rightLabel = new QLabel("右侧",this);
  stBar->addPermanentWidget(rightLabel);

  //铆接部件(浮动窗口)可以有多个
  QDockWidget *dW = new QDockWidget("浮动",this);
  addDockWidget(Qt::LeftDockWidgetArea,dW);

  //设置中心部件(文本编辑器)
  QTextEdit *edit = new QTextEdit(this);
  setCentralWidget(edit);
  
   
}

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


添加资源文件

设计窗图

ui界面直接添加控件,设计窗图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加资源文件并引用

鼠标右键->add new添加新文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  ui->setupUi(this);
//   ui->actionnew->setIcon(QIcon("C:\Users\26479\Pictures\20140210195808_XtEQF.jpeg"));
   //添加qt资源":+前缀名+文件名"
//actionopen这个空间名是在ui界面就添加的,如下图
  ui->actionopen->setIcon(QIcon(":/new/prefix1/icon"));

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模态和非模态对话框

模态对话框:不可以对其他窗口进行操作,会阻塞

非模态对话框:可以对其他窗口进行操作

 //头文件
 #include<QDialog>
 
 
 	//模态创建
    QDialog dlg(this);
    dlg.exec();
    
    //非模态对话框
    QDialog *dlg2 = new QDialog(this);
    dlg2->show();
    
    //在此处匿名对象创建的堆内存由于主窗图没有释放,堆内存也不会释放
    //因此可以手动设置一下,关闭对话框则释放内存
    connect(ui->actionopen,&QAction::triggered,[=](){
    
    //模态创建
    QDialog dlg(this);
    dlg.exec();
    
    //非模态对话框
    QDialog *dlg2 = new QDialog(this);
    //关闭时,释放堆内存
    dlg2->setAttribute(Qt::WA_DeleteOnClose);
    dlg2->show();
    
    });

其他标准对话框

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例子:

消息对话框

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文件对话框

返回值是选取的路径

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

打开txt类型的文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ui布局

在右边窗图上,选择相应的多个控件,设置水平/垂直布局,和弹簧可以使窗图无论怎么拉都不变形。

选择左边的控件,将其拖动到中间的ui里面即可添加

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多加点弹簧,使账号密码空间处于窗图最中间

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以设置窗图的最大最小值,以免缩放太小,导致看不清

先设置用户名的文本大小

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再设置密码的文本大小

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按钮也可以添加图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按钮组

单选按钮

选择按钮(单选)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但此时如果增加两个选择按钮为:已婚、未婚

则加上男、女四个选项只能选其一项。

但真实效果想要男/女,已婚/未婚。此时就可以用到按钮组

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将成组的按钮拖入同一个group box,即可实现

有三个组件层次:第一个层次是一个widget,其中包含两个按钮组(第二层),水平布局

第二个层次为两个按钮组,每个按钮组(第三层)为垂直布局。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置默认选项
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置单选按钮,男默认选择(男的按钮名称为radioButton)
    ui->radioButton->setChecked(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}
多选按钮
    //设置多选按钮,2是选中 0是未选择
    connect(ui->checkBox,&QCheckBox::stateChanged,[=](int state){
        qDebug() << state;
    });

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

listWidget

列表容器

    QStringList list;
    list << "锄禾"<<"悯农";
    ui->listWidget->addItems(list);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置文本居中方式

    QListWidgetItem *item = new QListWidgetItem("悯农");
    ui->listWidget->addItem(item);
    item->setTextAlignment(Qt::AlignHCenter);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

树控件

tree Widget

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    //设置水平头
    ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"介绍");
    QTreeWidgetItem *tItem = new QTreeWidgetItem(QStringList()<<"力量");
    //加载顶层结点
    ui->treeWidget->addTopLevelItem(tItem);
    //追加子结点
    QTreeWidgetItem *tCItem = new QTreeWidgetItem(QStringList()<<"力量1");
    tItem->addChild(tCItem);

表格控件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


    //设置列数
    ui->tableWidget->setColumnCount(3);
    //设置水平表头
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"年龄");
    //设置行数
    ui->tableWidget->setRowCount(3);
    //设置正文(0,0)位置,设置张三
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("张三"));

Qlabel图片显示

图片和动图的显示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义控件

新建一个自定义控件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绑定并新建类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在新建的ui中设计好自定义的控件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在主页面中使用这个自定义的控件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义控件中的两个控件相互绑定:


    //Qspinbox移动,Qslider跟着移动
    void(QSpinBox::*spSignal)(int) = &QSpinBox::valueChanged;
    connect(ui->spinBox,spSignal,ui->verticalSlider,&QSlider::setValue);
    //Qslider移动,Qspinbox跟着移动
    void(QSlider::*slSignal)(int) = &QSlider::valueChanged;
    connect(ui->verticalSlider,slSignal,ui->spinBox,&QSpinBox::setValue);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标事件

可以在窗口类中重写相应的鼠标事件的实现,进行相应逻辑处理。

常用的事件:

1.鼠标进入控件

2.鼠标离开控件

3.鼠标按下

4.鼠标释放

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如:实现函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标输出光标位置:

注意输出的格式跟printf差不多

这里的x,y是在控件内的xy 如果要获取主界面的坐标则需要使用获取函数globalX(),globalY()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标键左右同时按下

如果要判断是否左右鼠标键都同时按下,可结合&操作符

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标追踪

设置鼠标追踪:

如果鼠标追踪不设置,只有在鼠标点击这个控件的时候,才能调用实现的鼠标事件逻辑;而当设置了鼠标追踪则可以不用点击,也可以调用鼠标事件的逻辑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定时器(QTimer)

重写定时器事件

//类定义.h
#ifndef VOICE_H
#define VOICE_H

#include <QWidget>
#include <QTimerEvent>

namespace Ui {
class voice;
}

class voice : public QWidget
{
    Q_OBJECT

public:
    explicit voice(QWidget *parent = nullptr);
    ~voice();

    void timerEvent(QTimerEvent *);

private:
    Ui::voice *ui;
};

#endif // VOICE_H

#include "voice.h"
#include "ui_voice.h"
#include<QGroupBox>
#include<QTimerEvent>
#include<QDebug>

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

    //开启定时器
    startTimer(1000);//单位毫秒 1000毫秒=1秒
}

void voice::timerEvent(QTimerEvent *){
    //加static,num不是局部变量不会重复声明
    static int num = 1;
    qDebug() << (QString::number(num++));
}

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

效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个定时器

定时器都有唯一的timeId,可以通过判断timeId的方式来判断定时器。
voice::voice(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::voice)
{    //开启定时器 int id1 
     //int id2作为成员变量
    this->id1 = startTimer(1000);//单位毫秒 1000毫秒=1秒
    
    //开启定时器
    this->id2 = startTimer(2000);//单位毫秒 2000毫秒=2秒
}

void voice::timerEvent(QTimerEvent *te){
    //加static,num不是局部变量不会重复声明
    if (te->timerId() == id1){
    static int num = 1;
    qDebug() << (QString::number(num++));
    }
    
    if (te->timerId() == id2){
    static int num2 = 1;
    qDebug() << (QString::number(num2++));
    }
}


信号和槽方式(推荐)
    QTimer * timer = new QTimer(this);
    //启动定时器
    timer->start(500);
    //绑定信号和槽
    connect(timer,&QTimer::timeout,[=](){
            static int num = 1;
            qDebug() << (QString::number(num++));
    });

暂停定时器

    
    QTimer * timer = new QTimer(this);
    //启动定时器
    timer->start(500);
    //绑定信号和槽
    connect(timer,&QTimer::timeout,[=](){
            static int num = 1;
            qDebug() << (QString::number(num++));
    });
    
    //暂停定时器
    timer->stop();

事件分发器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绘图事件

//在widget中重写函数
void painEvent(QPaintEvent *);

void paint::painEvent(QPaintEvent *){
    //实例化画家对象
    QPainter painter(this);
    
    //设置画笔
    QPen pen(QColor(255,0,0));
    //设置画笔宽度
    pen.setWidth(3);
    //让画家使用这个笔
    painter.setPen(pen);
    
    //设置画刷
    QBrush brush(Qt::cyan);
    //让画家使用画刷
    painter.setBrush(brush);
    
    //指定两个点,画一条线
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    
    //画圆,圆心(100,100),横半径50,竖半径50,横半径!=竖半径时画的是椭圆
    painter.drawEllipse(QPoint(100,100),50,50);
    
    //画矩形,从(20,20)作为左顶点开始画一个长宽为50的正方形
    painter.drawRect(QRect(20,20,50,50));
    
    //画文字从(20,20)作为左顶点开始画一个长宽为50的正方形,并往这个矩形里面放"文字"两个字
    painter.drawText(QRect(20,20,50,50),"文字");
}

高级设置

抗锯齿

用于保证图片清晰度

效率比较低

    //实例化画家对象
    QPainter painter(this);
    //开启抗锯齿
    painter.setRenderHint(QPainter::Antialiasing);

移动(0,0)到某位置

    //移动(0,0)位置
    painter.translate(100,0);

恢复设置

    //还原设置
    painter.restore();

画图片

   //画图片
 painter.drawPixmap(20,100,QPixmap("./image.png"));

更新图片:

    //画图片
    int x;
    painter.drawPixmap(x,100,QPixmap("./image.png"));
    //如果要手动调用绘图事件,用update更新
    x = 20;
    update();

qt的绘图系统实际上是,使用Qpainter在QPainterDevice上进行绘制,他们之间使用QPaintEngine进行通讯(也就是翻译Qpainter的部分指令)

绘图设备是指继承QPainterDevice的子类,qt一共提供了四个这样的类

  • QPixmap:专门为图像在屏幕上的显示做了优化
  • QBitmap:是QPixmap的一个子类,色深限定为1,可以使用QPixmap的IsQBitmap()函数来判断是不是QBitmap
  • QImage:专门为图像的像素级访问做了优化(可以修改像素点)
  • QPicture:可以记录和重现QPainter的各项指令

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    //声明绘图设备
    QPixmap pix(300,300);
    //背景填充白色
    pix.fill(Qt::white);
    
   //声明画家
   QPainter painter1(&pix);
   //画图
painter1.drawPixmap(x,100,QPixmap("./image.png"));
   //保存图片
   pix.save("./save.png");
QImage

像素点修改

	//声明绘图设备
    QImage img;
    //加载图片
    img.load("./image.png");
    //修改像素点
    for(int i = 30;i<100;i++){
     for(int j = 50;j<100;i++){
        QRgb value = qRgb(255,0,0);
        img.setPixel(i,j,value);
     }
    }
    
   //声明画家
   QPainter painter2(this);
   //画图
   painter2.drawImage(0,0,img);
   
   //保存图片
   pix.save("./save.png");
QPicture
#include<QPicture>
void paint::painEvent(QPaintEvent *){
   //QPicture
   QPicture pic3;
   QPainter painter3;
   //开始往pic上画
   painter3.begin(&pic3);
   painter3.drawEllipse(QPoint(150,150),100,100);
   //结束画画
   painter3.end();
   //保存图片
   pic3.save("./test.zt");
   
   //重现QPicture的绘图指令
   QPainter painter4(this);
   QPicture pic4;
   pic4.load("./test.zt");
   painter4.drawPicture(0,0,pic4);
   }

文件读写(QFile)

读文件

打开文件路径
#include<QFileDialog>

    QFileDialog::getOpenFileName(this,"打开文件","C:\\Users");
读取文本

默认支持utf-8

    //获取文件路径
    QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users");
    
    //读取内容
    QFile file(str);
    //设置打开方式,只读
    file.open(QIODevice::ReadOnly);
    
    //读取到所有文本
    QByteArray array = file.readAll();
    //可以把array放入文本 setText(array)
    file.close();

格式编码设置:

#include<QTextCodec>

file::file(QWidget *parent) : QWidget(parent)
{
    //获取文件路径
    QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users");
    
    //读取内容
    QFile file(str);
    //设置打开方式,只读
    file.open(QIODevice::ReadOnly);
    
    //读取到所有文本
    QByteArray array = file.readAll();
    //可以把array放入文本 setText(array)
    
    QTextCodec *codec = QTextCodec::codecForName("gbk");
    codec->toUnicode(array);
//    ui->textEdit->setText(codec->toUnicode(array))
        file.close();
}

按行读取
file::file(QWidget *parent) : QWidget(parent)
{
    //获取文件路径
    QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users");
    
    //读取内容
    QFile file(str);
    //设置打开方式,只读
    file.open(QIODevice::ReadOnly);
    
    QByteArray array;
    //读到文件尾
    while(!file.atEnd()){
     //按行读取
     array += file.readLine();   
    }
    //文件关闭
    file.close();
}

写文件


    //追加方式进行写
    file.open(QIODevice::Append);
    file.write("aaaa");
    file.close();

文件信息读取

QFileInfo类

有文件的信息属性获取,例如:

1.path:前缀名(suffix())、后缀名

2.大小: size()

3.创建日期:created()

4.最后修改日期:lastModifed()

`c++
//获取文件路径
QString str = QFileDialog::getOpenFileName(this,“打开文件”,“C:\Users”);

//读取内容
QFile file(str);
//设置打开方式,只读
file.open(QIODevice::ReadOnly);

//读取到所有文本
QByteArray array = file.readAll();
//可以把array放入文本 setText(array)
file.close();

格式编码设置:

```c++
#include<QTextCodec>

file::file(QWidget *parent) : QWidget(parent)
{
    //获取文件路径
    QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users");
    
    //读取内容
    QFile file(str);
    //设置打开方式,只读
    file.open(QIODevice::ReadOnly);
    
    //读取到所有文本
    QByteArray array = file.readAll();
    //可以把array放入文本 setText(array)
    
    QTextCodec *codec = QTextCodec::codecForName("gbk");
    codec->toUnicode(array);
//    ui->textEdit->setText(codec->toUnicode(array))
        file.close();
}

按行读取
file::file(QWidget *parent) : QWidget(parent)
{
    //获取文件路径
    QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users");
    
    //读取内容
    QFile file(str);
    //设置打开方式,只读
    file.open(QIODevice::ReadOnly);
    
    QByteArray array;
    //读到文件尾
    while(!file.atEnd()){
     //按行读取
     array += file.readLine();   
    }
    //文件关闭
    file.close();
}

写文件


    //追加方式进行写
    file.open(QIODevice::Append);
    file.write("aaaa");
    file.close();

文件信息读取

QFileInfo类

有文件的信息属性获取,例如:

1.path:前缀名(suffix())、后缀名

2.大小: size()

3.创建日期:created()

4.最后修改日期:lastModifed()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

音乐制作软件Ableton Live 11 mac功能特点

Ableton Live 11 mac是一款数字音频工作站软件&#xff0c;用于音乐制作、录音、混音和现场演出是一款流行的音乐制作软件。 Ableton Live 11 mac特点和功能 Comping功能&#xff1a;Live 11增加了Comping功能&#xff0c;允许用户在不同的录音轨道上进行多次录音&#xff0c;…

1.3 市面常见测试接口的工具

通过前面的学习,涉及接口测试的一些基础知识我们都已经有了了解,那本小节,我们来看看工作中比较常用的测试接口的工具有哪些。 PostmanPostman是我们平常工作中,最最常用的用来测试接口的工具。对于前端开发和后端开发来说,Postman也是工作中必会的工具,那对于我们测试来…

ChatGPT 也宕机了?如何预防 DDOS 攻击的发生

最近&#xff0c;开发人工智能聊天机器人的公司 OpenAI 遭受了一次规模较大的分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;导致其旗下的 ChatGPT 服务在短短 12 小时内遭遇了 4 次断网&#xff0c;众多用户遭受了连接失败的问题。 这次攻击事件引起了广泛的关…

图片懒加载vue3-lazy

目录 一、实现原理 二、如何使用 1.安装命令 2.main.js入口文件注册插件 3.template中使用指令 三、总结 最近在重构 博客 的时候遇到页面加载慢的问题&#xff0c;原因是页面小图标太多&#xff0c;一次性加载页面压力超大&#xff0c;打算图片可视区域化懒加载&#xf…

JMeter逻辑控制器

JMeter逻辑控制器 一、IF控制器1、作用2、步骤 二、循环控制器1、作用2、步骤3、线程组和循环控制器的区别&#xff1f; 三、ForEach控制器1、作用2、步骤 一、IF控制器 1、作用 **控制下面的测试元素是否执行**2、步骤 添加线程组用户定义的变量添加if控制器&#xff0c;判断…

力扣90. 子集 II(Java 回溯法)

Problem: 90. 子集 II 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 在本题中所给数组nums中的元素有重复&#xff0c;若再直接使用回溯的话会使得最终的子集有重复&#xff1b;其次我们应该知道求子集&#xff0c;求组合这类使用回溯处理的题目&#xff0c;在核心…

【VRTK】【VR开发】【Unity】12-占位身体

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概要】 目前你会发现,就算存在非Trigger Collider的墙壁屏障等,也能够正常穿过,这会导致不沉浸的体验。你需要一个占位身体来实现让墙壁等碰撞并挡住自己…

使用rancher rke快速安装k8s集群

概述 Rancher Kubernetes Engine&#xff08;RKE&#xff09;是一个用于部署、管理和运行Kubernetes集群的开源工具。旨在简化Kubernetes集群的部署和操作。 RKE具有以下特点和功能&#xff1a; 简化的部署过程 RKE提供了一个简单的命令行界面&#xff0c;使您可以轻松地部署…

理解Socket

前言 我在去年就学习过Java中Socket的使用&#xff0c;但对于Socket的理解一直都是迷迷糊糊的。看了网上很多关于Socket的介绍&#xff0c;看完还是不太理解到底什么是Socket&#xff0c;还是很迷。直到最近在学习计算机网络&#xff0c;我才对Socket有了一个更深地理解。之前一…

GD32f103系列教程—(程序下载篇)

简介 芯片程序下载的方式有很多种&#xff0c;大部分的可以支持串口&#xff0c;SWD&#xff0c;jtag等方式进行下载&#xff0c;当然还有一些芯片可以支持IIC&#xff0c;SPI&#xff0c;以太网&#xff0c;USB等方式&#xff0c;其实原理大同小异。 GD32F103系列是可以支持串…

中文字符串逆序输出

今天碰到这个题&#xff0c;让我逆序输出中文字符串&#xff0c;可给我烦死了&#xff0c;之前没有遇到过&#xff0c;也是查了资料才知道&#xff0c;让我太汗颜了。 英文字符串逆序输出很容易&#xff0c;开辟一块空间用来存放逆序后的字符串&#xff0c;从后往前遍历原字符串…

windows安装sqlserver2008后连接失败问题

刚安装好的sqlserver在安装服务器上&#xff0c;直接使用Windows身份认证登录就报错 未找到或无法访问服务器。请验证实例名称是否正确并且SQL Server已配置为允许远程连接。&#xff08;provider&#xff1a;命名管道提供程序&#xff0c;error&#xff1a;40 -无法打开到SQLS…

Springboot集成支付宝支付---完整详细步骤

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明&#xff1a;沙箱环境支持的产品&#xff0c;可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱&#xff0c;配置接口加签方式 在沙箱进行调试前…

【Stable Diffusion】在windows环境下部署并使用Stable Diffusion Web UI---通过 Conda

本专栏主要记录人工智能的应用方面的内容&#xff0c;包括chatGPT、AI绘图等等&#xff1b; 在当今AI的热潮下&#xff0c;不学习AI&#xff0c;就要被AI淘汰&#xff1b;所以欢迎小伙伴加入本专栏和我一起探索AI的应用&#xff0c;通过AI来帮助自己提升生产力&#xff1b; 订阅…

电子学会C/C++编程等级考试2021年03月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:生日相同 2.0 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。 时间限制:1000 内存限制:65536输入 第一行为整数n,表示有n个学生,n ≤ 180。此后每…

ChatGPT使用:一个发包机器人的提示词

发包机器人&#xff1a; 设想&#xff1a;目前项目组有n条打包线会输出多个包&#xff0c;用户想获取最新的包是比较困难的&#xff0c;难点在于 1. 分支多&#xff1a;trunk&#xff0c;release&#xff0c;outer等&#xff0c;至少有3个分支&#xff1b; 2. 多平台&#x…

Java小案例-RocketMQ的11种消息类型,你知道几种?(事务消息)

前言 上一节给大家讲了Rocket的延迟消息&#xff0c;这一节和大家聊一下事务消息&#xff0c;关于延迟消息大家可以点下面这个链接直接看。 事务消息 事务消息是RocketMQ提供的一种类似X/Open XA的分布式事务功能。通过RocketMQ的事务消息&#xff0c;可以达到分布式事务的最…

什么是数据可视化?数据可视化的优势、方法及示例

前言 在当今的数字时代&#xff0c;数据是企业和组织的命脉&#xff0c;生成的数据量呈指数级增长。这种被称为大数据的海量数据在洞察力和决策方面具有巨大的潜力。然而&#xff0c;如果没有一种有效的方法来分析和理解这些数据&#xff0c;它就会变得毫无意义和难以管理。这就…

SaaS 电商设计 (五) 私有化部署-实现 binlog 中间件适配

一、 背景 具体的中间件私有化背景在上文 SaaS 电商设计 (二) 私有化部署-缓存中间件适配 已有做相关介绍.这里具体讨论的场景是通过解析mysql binlog 来实现mysql到其他数据源的同步.具体比如:在电商的解决方案业务流中经常有 ES 的使用场景,用以解决一些复杂的查询和搜索商品…

GD32F4标准外设库

学习目标 了解标准库来源熟悉模板搭建流程掌握在已有模板基础下进行开发学习内容 标准外设库获取 标准固件库获取我们可以从官网进行下载。 下载链接:兆易创新GigaDevice-资料下载兆易创新GD32 MCU 找到 GD32F4xx Firmware Library 这个压缩包 下载完成后,进行解压,解压…