目录
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 *,成员函数指针1,const 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文本流读写文件
该类可以实现对文本的修改