Qt学习笔记

QT学习

什么是QT

Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,易于扩展,允许组件编程。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WP。

学习视频教程网站http://my.tv.sohu.com/pl/5176735/

QT/安装步骤/环境搭建

下面介绍Windows版QT开发环境Qt Creater + MinGW + Qt libraries配置方法

下载安装MinGW

从MinGW网站下载,默认安装到C盘根目录下:C:\MinGW,安装时选择C和C++ compiler,默认只选中了C编译器。

下载安装配置QT libraries

http://qt-project.org/downloads

默认安装路径为C:\Qt\4.8.3,安装时需要指定MinGW的安装路径为C:\MinGW。

安装完后需要把C:\Qt\4.8.3\bin目录添加到系统变量的Path路径中。

并新建系统环境变量QMAKESPEC,32位系统把值设置为C:\Qt\4.8.3\mkspecs\win32-g++;如果是64位系统,需要把值设置为C:\Qt\4.8.3\mkspecs\tru64-g++

还要新建系统环境变量QTDIR,值为C:\Qt\4.8.3

下载安装配置QT Creater

默认安装到C:\Qt\qtcreator-2.6.0目录下。

需要把C:\Qt\qtcreator-2.6.0\bin目录添加到系统变量的Path路径中。如果不设置系统环境变量,则创建工程时kit不能设置成功,并且可创建的工程类型也会受到限制。

设置QT Creator构建和运行配置项:打开QT Creator,选择菜单“工具/选项”,选择左边的”构建和运行”,再选择“Qt版本”选项卡,点击“添加”,qmake路径:C:\Qt\4.8.3\bin\qmake.exe。

还需要设置Compilers选项卡中的“手动设置”项的编译器,Name设置为MinGW,编译器路径设置为C:\MinGW\bin\mingw32-g++.exe。

hello word程序

1
2
3
4
5
6
7
8
9
#include <qcoreapplication>
#include<qdebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);</qdebug></qcoreapplication>

qDebug()<<"hello world";
return a.exec();
}

用界面标签显示Hello World

新建—>其他项—>空的QT项目—>c++ source

1
2
3
4
5
6
7
8
9
10
11
###basic application and HTML WIDEGTS
#include<qapplication>
#include<qlabel>
int main(int argc ,char *argv[])
{</qlabel></qapplication>

QApplication app(argc, argv);
QLabel *label =new QLabel("Hello World");//显示Hello World
label->show();
return app.exec();
}

pushButton按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui-&gt;setupUi(this);
ui-&gt;pushButton-&gt;setText("close");
}

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

添加事件—>信号槽—>clicked()—>close(), 这是直接在控件操作的

1
2
3
4
5
void Dialog::on_pushButton_clicked()
{

QMessageBox::information(this,"hello world","hello world");
}

和MFC中的messagebox(),效果一样。

1
2
3
4
5
6
7
void Dialog::on_pushButton_clicked()
{

//QMessageBox::information(this,"hello world","hello world");
ui->lineEdit->setText("Hello world!");
ui->lineEdit_2->setText("sssssss");
}

按一下按钮就在EDIT上面显示字符串”hello world”.

Signal和slot程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui-&gt;setupUi(this);
connect(ui-&gt;horizontalSlider,SIGNAL(valueChanged(int)),ui-&gt;progressBar,SLOT(setValue(int)));//添加信号
}

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

或者直接用信号槽和上面的一样

如果再加一条工程条,则代码一样

1
connect(ui-&gt;horizontalSlider,SIGNAL(valueChanged(int)),ui-&gt;progressBar_2,SLOT(setValue(int)));

只是其中的名字发生了改变ui->progressBar–>ui->progressBar_2

下面为取消信号槽

1
disconnect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->progressBar_2,SLOT(setValue(int)));

显示对话框

首先先创立工程文件 DialogTest—->然后点“在这里输入”—–>”输入File”——>在File下面输入所需要的列表”New Window”——->在界面上拖入文本框

然后执行下列程序

1
setCentralWidget(ui->plainTextEdit);//是文本框左右充满整个mainwindow

在DialogTest下面添加新的类MyDialog

然后在”New Window”添加触发事件trigged()

下面往里面添加代码

1
2
3
4
5
6
7
8
9
10
void MainWindow::on_actionNew_Window_triggered()
{

MyDialog dialog;

// dialog.setModal(true);
// dialog.exec();//显示Dialog(第一种显示方法)
dialog.show();这样直接是不好使的,dialog一闪就没

}

第二种dialog显示是在MainWindow类下直接写#include "mydialog.h"

然后在mainwindow.h里面private中声明MyDialog *mydialog

然后直接在

1
2
3
4
5
void MainWindow::on_actionNew_Window_triggered()
{
mydialog=new MyDialog(this);
mydialog->show();
}

layout

直接创建Qdialog,添加事件。

Basic Application and HTML Aware Widgets

对之前的helloworld进行文件的变化(比如加粗或者上颜色)

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<qapplication>
#include<qlabel>
int main(int argc ,char *argv[])
{</qlabel></qapplication>

QApplication app(argc, argv);
QLabel *label =new QLabel("<b>Hello</b> <span color="red" style="color: red;"> <i>World</i></font color =red>");//标签属性
label->show();
return app.exec();
//QLabel *label =new QLabel("</span>
<h2>Hello <span color="red" style="color: red;"> <i>World</i></font color =red></span></h2>
");标签可以随便加
}

Horizontal and Vertical Layouts

界面的布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<qapplication>
#include<qpushbutton>
#include<qhboxlayout>
#include<qvboxlayout>
int main(int argc ,char *argv[])
{</qvboxlayout></qhboxlayout></qpushbutton></qapplication>

QApplication app(argc, argv);
QWidget *window =new QWidget;//创建一个新的window
window->setWindowTitle("my app");//把window的title 设置为 my app
QPushButton *button1=new QPushButton("one");//button1名字为one
QPushButton *button2=new QPushButton("two");
QPushButton *button3=new QPushButton("three");
QHBoxLayout *layout=new QHBoxLayout;//创建一个水平布局变量
//QVBoxLayout *layout=new QVBoxLayout;//创建一个垂直布局变量
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
window->setLayout(layout);
window->show();
return app.exec();
}

QGridLayout

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<qapplication>
#include<qtgui>
#include<qtcore></qtcore></qtgui></qapplication>

int main(int argc ,char *argv[])
{

QApplication app(argc, argv);
QWidget *window =new QWidget;
window->setWindowTitle("my app");
QGridLayout *layout=new QGridLayout;
QLabel *label=new QLabel("Name:");
QLineEdit *txtName=new QLineEdit;
layout->addWidget(label,0,0);
layout->addWidget(txtName,0,1);
window->setLayout(layout);
window->show();
return app.exec();
}

如果还要在加一行

1
2
layout->addWidget(label2,1,0);//把名字改变就行,然后里面的参数也要改变
layout->addWidget(txtName2,1,1);

往里面添加按钮

1
layout->addWidget(button,2,0,1,2);//行,列 ,上下宽度,左右长度

Splitters

Qdialog

用到spliter键,我们可以用两个按钮进行演示—->先用水平splider—>水平布局

QDir

调用#include<QDir>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <qcoreapplication>
#include <qdebug>
#include <qdir>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir m_dir("C:\\TEXT");
qDebug() << m_dir.exists();
return a.exec();
}
​```</qdir></qdebug></qcoreapplication>

其作用是判断一个某个路径下的文件是否存在
如果存在返回“true”不存在返回"false"

​```c
int main(int argc, char *argv[])
{
QDir m_dir;
foreach (QFileInfo M_Item,m_dir.drives())
{
qDebug() << M_Item.absoluteFilePath();//返回硬盘的路径

}

}

下面这段程序为判断是否这有没”3.txt”文件,如果没有则创建,然后输出”created”,否则输出”already exists”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
QDir m_dir;
QString m_path="C:\\3.txt";
if(!m_dir.exists(m_path))
{
m_dir.mkpath(m_path);
qDebug()<<"Created";

}
else
{

qDebug()<<"Already Exits";

}
QDir m_dir;
QString m_path="C:/";
m_dir.setPath(m_path);
foreach (QFileInfo m_Item, m_dir.entryInfoList())
{

qDebug()<<m_Item.absoluteFilePath();//为查看当前下的文件目录
}

QFile文件读写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void write(QString Filename)//文件写
{
QFile mFile(Filename);
if(!mFile.open(QFile::WriteOnly|QFile::Text))
{
qDebug()<<"could not open the file for writting";
return;
}
else
{
QTextStream out(&mFile);
out<<"Hello man!";
qDebug()<<"Write Correctly";

}
mFile.flush();
mFile.close();

}
void read(QString Filename)//文件读
{
QFile mFile(Filename);
if(!mFile.open(QFile::ReadOnly|QFile::Text))
{
qDebug()<<"could not open the file for writting";
return;
}
else
{
QTextStream in(&mFile);
QString s=in.readAll();
qDebug() << s;
qDebug() << "Read Correctly"; } mFile.close(); } ``` ### CheckBox和RadioBOX、Commbox, listwidget ```c void Dialog::on_pushButton_clicked() { if(ui-&gt;checkBox-&gt;isChecked()//ui-&gt;radioBox-&gt;isChecked())//判断是否已经选择 { QMessageBox::information(this,"","selected"); } else { QMessageBox::information(this,"","not selected"); } } ``` ``ui-&gt;comboBox-&gt;addItem("123");//commbox加项`` 显示当前comboBox所选择项的文本 ```c QMessageBox::information(this,"",ui-&gt;comboBox-&gt;currentText());

显示当前listwidget所选择项的文本

1
2
3
4
QMessageBox::information(this,"hello world",ui-&gt;listWidget-&gt;currentItem()-&gt;text());
QListWidgetItem *item=ui-&gt;listWidget-&gt;currentItem();
item-&gt;setText("123");//选中当前项然后改变的文本
item-&gt;setTextColor(Qt::red);//把当前文本变成红色

qtreewidget

首先在Dialog.h里面声明两个函数 (addroot 和 addchild)

1
2
void AddRoot(QString name, QString Description);
void AddChild(QTreeWidgetItem *parent, QString name, QString Description);

然后在构造函数里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ui-&gt;treeWidget-&gt;setColumnCount(2);
AddRoot("HELLO","WORLD");
AddRoot("2","3");
void Dialog::AddRoot(QString name ,QString Description)
{
QTreeWidgetItem *itm=new QTreeWidgetItem(ui-&gt;treeWidget);
itm-&gt;setText(0,name);
itm-&gt;setText(1,Description);
ui-&gt;treeWidget-&gt;addTopLevelItem(itm);//这如果删除会产生什么情况
AddChild(itm,"one","hello");
AddChild(itm,"two","world");
}
void Dialog::AddChild(QTreeWidgetItem *parent,QString name,QString Description)
{

QTreeWidgetItem *itm=new QTreeWidgetItem(ui-&gt;treeWidget//这如果删除会产生什么情况);
itm-&gt;setText(0,name);
itm-&gt;setText(1,Description);
parent-&gt;addChild(itm);
}

在AddRoot()中加入AddChild()

1
2
3
4
5
6
7
8
9
void Dialog::AddRoot(QString name, QString Description)
{
QTreeWidgetItem *itm=new QTreeWidgetItem(ui-&gt;treeWidget);
itm-&gt;setText(0,name);
itm-&gt;setText(1,Description);
ui-&gt;treeWidget-&gt;addTopLevelItem(itm);
AddChild(itm,"one","hello");
AddChild(itm,"two","world");
}

button里面

1
2
3
4
5
6
7
void Dialog::on_pushButton_clicked()
{

ui-&gt;treeWidget-&gt;currentItem()-&gt;setBackgroundColor(0,Qt::red);//设置第一排颜色为red
ui-&gt;treeWidget-&gt;currentItem()-&gt;setBackgroundColor(1,Qt::yellow);//设置第一排颜色为yellow

}

设置头标签

1
2
3
4
5
6
7
8
9
10
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui-&gt;setupUi(this);

ui-&gt;treeWidget-&gt;setColumnCount(2);
//ui-&gt;treeWidget-&gt;setHeaderLabel("123");
ui-&gt;treeWidget-&gt;setHeaderLabels(QStringList()&lt;&lt;"123"&lt;&lt;"456"); AddRoot("HELLO","WORLD"); AddRoot("2","3"); } ui-&gt;treeWidget-&gt;setHeaderLabel("123");
ui-&gt;treeWidget-&gt;setHeaderLabels(QStringList()&lt;&lt;"123"&lt;&lt;"456");