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(); }
|
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->setupUi(this); ui->pushButton->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->setupUi(this); connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->progressBar,SLOT(setValue(int)));//添加信号 }
MainWindow::~MainWindow() { delete ui; }
|
或者直接用信号槽和上面的一样
如果再加一条工程条,则代码一样
1
| connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->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,添加事件。
对之前的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->checkBox->isChecked()//ui->radioBox->isChecked())//判断是否已经选择 { QMessageBox::information(this,"","selected"); } else { QMessageBox::information(this,"","not selected"); } } ``` ``ui->comboBox->addItem("123");//commbox加项`` 显示当前comboBox所选择项的文本 ```c QMessageBox::information(this,"",ui->comboBox->currentText());
|
显示当前listwidget所选择项的文本
1 2 3 4
| QMessageBox::information(this,"hello world",ui->listWidget->currentItem()->text()); QListWidgetItem *item=ui->listWidget->currentItem(); item->setText("123");//选中当前项然后改变的文本 item->setTextColor(Qt::red);//把当前文本变成红色
|
首先在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->treeWidget->setColumnCount(2); AddRoot("HELLO","WORLD"); AddRoot("2","3"); void Dialog::AddRoot(QString name ,QString Description) { QTreeWidgetItem *itm=new QTreeWidgetItem(ui->treeWidget); itm->setText(0,name); itm->setText(1,Description); ui->treeWidget->addTopLevelItem(itm);//这如果删除会产生什么情况 AddChild(itm,"one","hello"); AddChild(itm,"two","world"); } void Dialog::AddChild(QTreeWidgetItem *parent,QString name,QString Description) {
QTreeWidgetItem *itm=new QTreeWidgetItem(ui->treeWidget//这如果删除会产生什么情况); itm->setText(0,name); itm->setText(1,Description); parent->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->treeWidget); itm->setText(0,name); itm->setText(1,Description); ui->treeWidget->addTopLevelItem(itm); AddChild(itm,"one","hello"); AddChild(itm,"two","world"); }
|
button里面
1 2 3 4 5 6 7
| void Dialog::on_pushButton_clicked() {
ui->treeWidget->currentItem()->setBackgroundColor(0,Qt::red);//设置第一排颜色为red ui->treeWidget->currentItem()->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->setupUi(this);
ui->treeWidget->setColumnCount(2); //ui->treeWidget->setHeaderLabel("123"); ui->treeWidget->setHeaderLabels(QStringList()<<"123"<<"456"); AddRoot("HELLO","WORLD"); AddRoot("2","3"); } ui->treeWidget->setHeaderLabel("123"); ui->treeWidget->setHeaderLabels(QStringList()<<"123"<<"456");
|