QT基础

1.Hello world

用于APP开发需要引入QApplication库,并创建相应的对象。并使用QLabel类在窗口中输出字符串。如下

#include<QApplication>
int main(int argc,char * argv[])
{
	QApplication app(argc,argv);
	QLabel ql("Hellow world");
	ql.show();
	
	app.exec();		//等待用户操作
	return 0;
}
	

2. QT的模块

详见
Qt学习之路2

3. 信号与槽

当 sender发出 某个信号之后,如果有receiver对该信号感兴趣,则会 接受该信号,做出某些动作。
而槽就指的是 接受者做出的响应。
连接connect
在QT中使用connect将 信号发出者、信号、信号接受者 和 槽 联系在一起。信号和槽的 输入参数类型必须一致,槽的参数数目可以比信号参数数目少,即忽略某些信号。

QObject::connect(const Qbject *,成员函数指针1const QObject *,成员函数指针2);
Newspaper n("Today");
reader s();
QObject::connect(&n,&newspaper::Paper,&s,&reader::GetPaper);

Lambda表达式
即使用Lambda表达式实现槽,而无需指定信号接受者。

例如有新报纸到达,读者就会知晓该信息

#include<QApplication>
#include<QObject>
#include<QDebug>
class Newspaper:public QObject
{
	Q_OBJECT	//继承QObject类才能信号槽,并写入Q_OBJECT宏
public:
	QString name;
	Newspaper(QString n){name = n;}
	void PaperComing(){emit Paper(name);}	// emit发射信号,发射的信号是属性name

signals:			//信号
	void Paper(QString n);	//表示将字符串n作为信号发射。信号为输出void的函数,无需任何实现。
};

class Reader:public QOBject
{
Q_OBJECT;
public:
	Reader(){};
	void GetPaper(QString n){qDebug()<<"get "<<n;}
};
int main(int argc,char* argv[])
{
	QApplication app(argc,argv);
	Newspaper np("Today");
	Reader r();
	QObject::connect(&np,&Newspaper::Paper,&r,&Reader::GetPaper);
	np.PaperComing();
	app.exec();
	return 0;
}
	

4. 事件系统

QT中的QObject 对象的exec()方法会一直监视可能出现的事件,例如鼠标按下、抬起、键盘按下抬起等。当事件与信号重合时,只会执行事件而不再触发信号(见添加链接描述第一二张图)

4.1. 事件处理机制

当QT监控到有事件发生时,会自动创建一个QEvent子类的对象 表示它,并通过QObject的event()->type() 确定事件类型,从而调用不同的时间处理函数,包括paintEvent(QEvent * event)、mousePressEvent(QEvent * event)等等。

QWidget类有各种事件处理虚函数,因此子类对象可以对其进行覆写,实现不同事件产生不同的结果

Class MainWindow::public QMainWindow
{
	Q_OBJECT
public:
	explicit MainWindow(QMainWindow * parent = 0);
	QLabel label(this);
protected:
void mousePressEvent(QEvent * event)
{
	int x = event->x();
	int y = event->y();
	QString str = QString("( %1, %2)").arg(x).arg(y);
	this->label.setText(str);
}}
	

event->accept()与event->ignore()决定事件是接受还是忽略,如果忽略则事件会传递给 该部件的 父部件。event->type()返回事件类型

4.2. 事件过滤器

可以给任意QObject安装,从而实现对该QObject的多个 子控件 进行事件过滤。
例如主界面MainWindow有多个子控件,首先为需要定义事件的子控件 安装事件滤波器eventFilter(QObject * obj, QEvent * event),即为obj的event事件进行过滤操作。

如图所示事件处理流程,父窗口通过eventFilter进行事件过滤,决定事件穿给哪个子对象,每个子对象有一个event()通过判断事件类型,将事件传送给不同的事件函数(需要覆写)进行处理。
在这里插入图片描述

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QLabel  *l1 ;
     bool eventFilter(QObject *obj,QEvent *ev);
private:
    Ui::MainWindow *ui;
};
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    l1 = new QLabel("label1",this);
    l1->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
{
        if(ev->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *ky = static_cast<QMouseEvent *>(ev);
            int x = ky->x();
            int y = ky->y();
            l1->setText(QString("%1,%2").arg(x).arg(y));
            return 1;
        }
    return QMainWindow::eventFilter(obj,ev);
}

5. 自定义控件

QT支持在UI中自行添加控件,并改变布局,对于任意的控件既可以在 设计师内进行设计 也可以在代码中设计。
在代码中可以使用
ui->控件名称->方法
进行改变其属性。同时对于任意控件,可以右击,选择转到槽实现connect,可以编写该控件的自定义槽函数。
右击控件,选择提升为可以实现将控件 类提升为自定义类。

QDebug

qDebug()<<"abc";	// 控制台输出

QRect

QRect  rect = new QRect();
QRect  rect = new QRect(int x,int y,int width,int height); //表明一个框体的几何值
rect.bottom();rect.top();rect.center();

QAction

表示抽象的界面动作类,对于菜单、图标等可以addAction()一个QAction对象,用QAction对象与某个槽连接,实现菜单、图标的某种动作。

QAction * qa = new QAction();

QWidget

QWidget * widget = new QWidget(父窗口QWidget * parent,);

widget->show();
widget->setWindowState();		//设置窗口状态,包括最大化最小化全屏等;
widget->setWindowTittle();		//设置窗口标题;
widget->x(); widget->y(); 		//窗口显示位置;

QRect frame = widget->frameGeometry();	//返回带边框的窗口几何信息

QMainWindow主窗口类

QMainWindow * mwindow = new QMainWindow();

QDialog对话框类

QDialog * dialog = new QDialog();
dialog->setModal(bool modal);		//是否是模态对话框,即关闭该对话框之前是否可以与其他对话框交互

QFileDialog文件对话框类

QFileDialog * filedialog = new QFileDialog();
QString filename = filedialog->getOpenFileName(QWidget * parent,QString 文件对话框标题,QString 路径,QString 文件过滤);		//文件对话框选择文件,例如
QString filename = filedialog->getOpenFileName(QWidget * parent,"Find File","/home",tr("Image files (*.jpg *.png);;Word(*.doc *.docx)"));
QString filename = filedialog->getSaveFileName(QWidget * parent,"Save File","/home",tr("Image files (*.jpg *.png);;Word(*.doc *.docx)"));		//保存文件对话框

QInputDialog输入对话框类

bool ok;
QString str= QInputDialog::getText(...&ok);		//输入字符串,注意ok为判断是否按下。
int value = QInputDialog::getInt(...,&ok);
double value = QInputDialog::getDouble(...,&ok);

QStringList items;
items<<tr("条目1")<<tr("条目2")<<tr("条目3");
QString item = QInputDialog::getItem(...,items,0,true,&ok);		//下拉条目对话框

QMessageBox消息对话框类

int ret = QMessageBox::question(...,QMessageBox::Yes,QMessageBox::No);	//问题对话框
int ret = QMessageBox::information(...,QMessageBox::Ok);	//提示对话框
int ret = QMessageBox::warning(...,QMessageBox::Abort);	//警告对话框
int ret = QMessageBox::critical(...,QMessageBox::YesAll);	//错误对话框
int ret = QMessageBox::about(...);	//关于对话框

QWizard向导对话框类

创建多个向导对话框。

QWizard wizard(QWidge * parent);
wizard.setWindowTitle(QString );			//向导窗口命名
wizard.addPage(QWizardPage *);				//向导中加入向导页

QWizardPage * wizardpage = new QWizardPage;		//向导页对象
wizardpage->setTitle("Introduction");		//向导页内容。

QFrame边框部件类

带有边框部件的基类,包括标签部件、边框、面板、阴影等。

QTextEdit富文本编辑类

可实现对文本的格式、颜色、图片等等进行编辑

QLabel标签类

用于显示文本与图片

QLabel * label = new QLabel(QWidget * parent);
label->show();
label->setText(QString str);	//设置文字
label->setWindow(QString str);	//设置文字

QFont字体类

用于显示文本与图片

QFont font;
font.setFamily("宋体");
font.setPointSize(20);

QTextDocument文本片段容器类

每个文本片段容器 含有多个文本片段QTextFragment。

QPushButton按钮部件类

按钮

QPushButton pushbutton(QWidget * parent);
pushbutton.setText("abc");		//按钮名称
pushbutton.setIcon(QIcon(".../images/help.png"));	//按钮图标

QPainter画家类

画家类,QPainter对象可用绘制图片。
QT中图形的绘制是通过 ** paintEvent( QPaintEvent * event) ** 自动调用,可直接在该方法内部写绘制函数。

void paintEvent(QPaintEvent * ev)
{
	QPainter p(this);		//指明绘制父组件
	p.drawArc(...);
	p.drawEllipse(...);
	p.drawPoint(...);
	p.drawPolyline(...);
	p.drawLine(...);
	p.drawText(...);
}	

使用Update(int,int,int,int,int)实现图形重绘,即调用paintEvent(QPaintEvent *ev);

去窗口边框setWindowFlages(Qt::FramelessWindowHint | windowFlages());
窗口背景色设置为透明set Attribute(Qt::TranslucentBackground);

QPainterPath绘制路径类

QPaintPather对象方法可以通过移动点来绘制路径

QPainterPath path;
path.moveTo(0,0);
path.lineTo(100,200);		//连接100,200并将点移动至100,200
path.lineTo(200,300);		//连接200,300并将点移动至200,300
path.lineTo(300,400);
QPainter::drawPath(path);

QPen画笔类

用于改变线条的 形状 和轮廓。并需要为QPainter对象指明QPen对象。

QPen pen(Qt::green,5,Qt::DotLine,Qt::RoundCap,Qt::RoundJoin);
QPainter p(this);
p.setPen(pen);

QBrush画刷类

对图形进行填充以及风格的定义。

QBrush brush(QColor(0,0,255),Qt::Dense4Pattern);
brush.setTexture(QPixmap("../1.png"));
QPainter p(this);
p.setBrush(brush);

QPaintDevice画图设备类

类似于画板,使用QPainter在QPaintDevice上面绘制图像。

QImage

可以获得图像的各种信息,也可以改变图像

QImage image(400,300,QImage::Format_ARGB32);	//画板大小以及透明形式
image.load("../1.png");

QPainter p;
p.begin(&image)
p.drawImage(0,0,image);
image.setPixel(QPoint(100,200),qRgb(0,255,0));		//像素点设置
p.end();

QPixmap

不可对图片进行修改,可以进行绘图,可以在线程中绘图。
QPixmap::toImage() 和 QPixmap::fromImage(QImage)进行 QPixmap和QImage相互转换。

6. Graphics View Framework图形视图框架

QGraphicsScene场景

QGraphicsView视图

QGraphicsItem图形

QIODevice输入/输出类

QFile

用来读写文件,指定文件名之后便可以针对该文件进行操作。
常用QByteArray对象存储文件内容

QString path = QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");
QFile file(path);
file.open(QIODevice::ReadOnly);
QByteArray array = file.readAll();		//文件内容读取,只识别UTF8
file.close();			//关闭操作

QString path = QFileDialog::getSaveFileName(this,"SAVE","../","TXT(*.txt)");
QFile file(path);
file.open(QIODevice::WriteOnly);
QString str = ui->textEdit->toPlainText();
file.write(str.toUtf8());		//文件写
file.close();

QTextStream文本流读写文件

该类可以实现对文本的修改

QBuffer

QProcess

QTCPsocket

QUDPsocket

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starry丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值