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

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的父类-》QWidgetWidget 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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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 += widgetsCONFIG += 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.uiTRANSLATIONS += \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_OBJECTpublic: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_OBJECTpublic: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 *){//QPictureQPicture 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.mzph.cn/news/225255.shtml

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

相关文章

【最新版】PyCharm基础调试功能详解

文章目录 一、断点1. 断点的类型a. 行断点b. 异常断点 2. 设置断点a. 设置行断点b. 设置异常断点 3. 管理断点a. 删除断点b. 将断点静音 二、调试功能0. 测试代码1. 设置断点2. 调试的多种启动方式3. 观察调试控制台a. 步过b. 步入c. 单步执行代码d. 步出e. 运行到光标处f. 重新…

LVS简介及LVS-NAT负载均衡群集的搭建

目录 LVS群集简介 群集的含义和应用场景 性能扩展方式 群集的分类 负载均衡&#xff08;LB&#xff09; 高可用&#xff08;HA&#xff09; 高性能运算&#xff08;HPC&#xff09; LVS的三种工作模式 NAT 地址转换 TUN IP隧道 IP Tunnel DR 直接路由 Direct Rout…

Leaflet.Graticule源码分析以及经纬度汉化展示

目录 前言 一、源码分析 1、类图设计 2、时序调用 3、调用说明 二、经纬度汉化 1、改造前 2、汉化 3、改造效果 总结 前言 在之前的博客基于Leaflet的Webgis经纬网格生成实践中&#xff0c;已经深入介绍了Leaflet.Graticule的实际使用方法和进行了简单的源码分析。认…

鸿蒙小车之多任务调度实验

说到鸿蒙我们都会想到华为mate60&#xff1a;遥遥领先&#xff01;我们一直领先&#xff01; 我们这个小车也是采用的是鸿蒙操作系统&#xff0c;学习鸿蒙小车&#xff0c;让你遥遥领先于你的同学。 文章目录 前言一、什么是任务&#xff1f;为什么要有任务二、任务的状态三、任…

Python 自动化之收发邮件(二)

发邮件之Windows进程监控 文章目录 发邮件之Windows进程监控前言一、基本内容二、基本结构三、库模块四、函数模块1.进程监控2.邮件发送 五、程序运行模块1.获取时间2.用户输入3.进程监控3.1进程启动发邮件3.2进程停止发邮件 总结 前言 上一篇简单写了一下如何进行邮件的收发操…

LeetCode 2415. 反转二叉树的奇数层:深度优先搜索(DFS)

【LetMeFly】2415.反转二叉树的奇数层&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/ 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c…

部署LVS的NET模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

Axure元件库的介绍以及个人简介和登录界面案例展示

目录 一. 元件介绍 二. 基本元件的使用 2.1 形状元件 2.2 图片元件 2.3 占位符 2.4 文本 2.5 线段元件 2.6 热区文件 三. 表单元件的使用 3.1 文本框 3.2 文本域 3.3 下拉列表 3.4 列表框 3.5 复选框 3.6 单选按钮 四. 菜单与表格元件的使用 4.1 树 4.2 表格…

持续集成交付CICD:GitLabCI操作Harbor仓库

目录 一、实验 1.GitLabCI操作Harbor仓库 二、问题 1.gitlab-runner连接docker daemon报错 一、实验 1.GitLabCI操作Harbor仓库 &#xff08;1&#xff09;修改GitLabCI共享库代码并提交到mater CI.yaml .pipelineInit:tags:- buildstage: .prevariables:GIT_CHECKOUT: …

金蝶云星空协同开发环境应用内执行单据类型脚本

文章目录 金蝶云星空协同开发环境应用内执行单据类型脚本业务界面查询单据类型表数据导出数据执行数据库脚本单据类型xml检验是否执行成功检查数据库检查业务数据 金蝶云星空协同开发环境应用内执行单据类型脚本 业务界面 查询单据类型表数据 先使用类型中文在单据类型多语言…

C++使用回调函数的两种方式

一.函数指针 #include <iostream>typedef void (*callback)(int ,int); class MyTest { public:void setCallback(callback cb){m_callback = cb;}void add(int a, int b){m_callback(a, b);}private:callback m_callback; };void onCallback(int a, int b) {std::cout …

[C++]——学习模板

了解模板——初阶 前言&#xff1a;一、模板1.1 什么是模板1.2 模板的概念1.3 模板可以做什么1.4 泛型模板 二、函数模板2.1 函数模板概念和格式2.2 函数模板原理2.3 函数模板实例化2.3.1 隐式实例化2.3.2 显式实例化 2.4 模板参数的匹配原则2.5 函数模板声明定义分离 三、类模…

若依框架springboot——修改前端图片上传样式

简述 使用过若依框架的&#xff0c;一定知道若依前端框架上传图片的样式&#xff0c;是一个正方形加号图片&#xff0c;但是如果你要使用自定义样式呢。 比如将下面这个图进行修改呢 修改后的样式 你可以直接找到element-ui 修改上传图片的组件&#xff0c;也可以加入新的组…

AcWing 1250. 格子游戏(并查集)

题目链接 活动 - AcWing本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1252/ 题解 当两个点已经是在同一个连通块中&#xff0c;再连一条边&#xff0c;就围成一个封闭的圈。一般用x * n y的形式将&#xff08;x, y&#xff0…

CentOS 防火墙管理及使用的redis基本常用命令

文章目录 防火墙管理使用systemctl管理防火墙启动、关闭使用firewalld-cmd配置访问防火墙策略firewalld配置文件修改限制来源IP docker使用 redis 防火墙管理 需要关闭防火墙或者开启对应端口 使用systemctl管理防火墙启动、关闭 启动防火墙&#xff1a; systemctl start fi…

设计模式——桥接模式(结构型)

引言 桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 问题 抽象&#xff1f; 实现&#xff1f; 听上去挺吓人&#xff1f; 让我们慢慢来&#xff0c; 先考虑一个简单的…

物联网智能仓库解决方案

物联网智能仓库解决方案是一种基于物联网技术的仓库管理系统&#xff0c;通过自动化设备、智能化管理系统和大数据分析等技术&#xff0c;实现仓库的智能化运营和管理。 物联网智能仓库解决方案包括&#xff1a; 仓库设备自动化&#xff1a;通过自动化设备和技术&#xff0c;实…

18--日志(了解)

1、日志 1.1 什么是日志 日志用来记录用户操作、系统运行状态等&#xff0c;是一个系统的重要组成部分。对于一些简单的小程序&#xff0c;可能并不需要在如何记录日志的问题上花费太多精力。但是对于作为基础平台为很多产品提供服务的后端程序&#xff0c;就必须要考虑如何依…

KVM虚拟机console使用

注意这些设置都在你要进入虚拟机里设置&#xff0c;不是在你的物理机设置 首先debian12 需要设置 grep ttyS0 /etc/securetty #没有则加上 echo ttyS0 >> /etc/securetty #启动 systemctl start serial-gettyttyS0 systemctl enable serial-gettyttyS0#CentOS Stream …

Springboot+vue的公寓报修管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的公寓报修管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的公寓报修管理系统&#xff0c;采用M&#xff08;model&…