2017年5月22日星期一

C++ Qt Programming

## 7. Basic Application and html aware widegts
创建一个空工程
添加一个C++,写入:
#include<QApplication>
#include<QLable>
int main(int argc,char* argv[])
{
QApplication app(argc,argv);
QLabel *label=new QLabel("Hello HTML label<h2>Headers2</h2>");
label->show();
turn app.exec();
}
## 8.Horizontal and Vertical Layouts
创建一个空工程
添加一个C++源文件,写入:
#include<QApplication>
#include<QPushButton>
#include<QHBoxLayout>
#include<QVBoxLayout>
{
QApplication app(argc,argv);
QWidget *window=new QWidget;
window->setWindowTitle("MyApp");
QPushButton *button1=new QPushButton("one");
QPushButton *button2=new QPushButton("two");
QPushButton *button3=new QPushButton("three");
QHBoxLayout *hlayout=new QHBoxLayout;
hlayout->addWidget(button1);
hlayout->addWidget(button2);
hlayout->addWidget(button3);
QVBoxLayout *vlayout=new QVBoxLayout;
vlayout->addWidget(button1);
vlayout->addWidget(button2);
vlayout->addWidget(button3);

window->setLayout(hlayout);//难道只能设置一个layout?
window->show();
turn app.exec();
}
## 9.QGridLayout
创建一个空工程
添加一个C++源文件,写入:
#include<QApplication>
#include<QPushButton>
#include<QtGui>
#include<QCore>
{
QApplication app(argc,argv);
QWidget *window=new QWidget;
window->setWindowTitle("MyApp");
QGridLayout *layout=new QGridLayout;

QLabel *label1=new QLabel("name:");
QLineEdit *txtName1=new QLineEdit;
QLabel *label2=new QLabel("name:");
QLineEdit *txtName2=new QLineEdit;

layout->addWidget(label1,0,0);
layout->addWidget(txtName1,0,1);
layout->addWidget(label2,1,0);
layout->addWidget(txtName2,1,1);

QPushButton *button=new QPushButton("OK");
layout->addWidget(button,2,0,1,2);
window->setLayout(layout);
window->show();
turn app.exec();
}
## 10.Splitters
很简单,视频中只演示了添加控件的方法:
选中两个以上控件,用工具栏的QSpliiter工具(水平|垂直)
## 11.QDir
很简单,使用了Console和QDebug演示的.
这里只写出添加的代码
#include<QDir>
#include<QDebug>
...
QDir mDir
foreach(QFileInfo mItem,mDir,drivers())
{
qDebug()<<mItem.absoluteFilePath();
}
...

## 12.QFile
很简单,同样也使用Console+QDebug
主要代码
#include<QFile>
#include<QString>
...
..
..
void Write(QString Filename)
{
QFile mFile(Filename);
if(!mFile.open(QFile::WriteOnly|QFile::Text);
{
qDebug()<<"Written Failed!");
return;
}
QTextStream out(&mFile);
out<<"Hello,QFile!";
mFile.flush();
mFile.close();

}
void Read(QString Filename)
{
QFile mFile(Filename);
if(!mFile.open(QFile::ReadOnly|QFile::Text);
{
qDebug()<<"Read Failed!");
return;
}
QTextStream in(&mFile);
QString mText=in.readAll();
qDebug()<<mText;
mFile.close();
}
int main()
...
QString mFilename="E:/File/file1.txt";
Write(mFilename);
Read(mFilename);
...
## 13.Resource Files
手动添加就可以了...
100g大米=346卡路里=4.186*346J=1448.56J
1度电=2448*100g大米
14.QLabel and QT Designer
没啥好说的,就是告诉你怎么使用它的creator
## 15.QPushButton
之前已经介绍过了,主要是会利用signal和slot
16.QLineEdit
17.
## 18.QRadioButton
需要把这些RadioButton放在一组
判定是哪个radio:xxx_radio.isChecked();
19.QComboBox(下拉组合列表)
QMessageBox::information();
20.QListWidget

1644454 102.5gb
## 21.QTreeWidget
使用了Dialog
其中加入了Tree Widget
主要代码:
//在Dialog构造函数中加入:
ui->treeWidget->setColumnCount(2);
Addroot("hello","world");
void 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 Addchild(QTreeWidgetIterm *parent, QString name, QString Description)
{
QTreeWidgetItem *itm=new QTreeWidgetItem();
itm->setText(0,name);
itm->setText(1,Description);
parent->addChild(itm);
}
## 22.QTreeWidget Continued
单击选中项变色
ui->treeWidget->currentItem()->setBackgroundColor(0,Qt::read);
Dialog函数中接着添加:
ui->treeWidget->setHeaderLabel(QStringList()<<"one"<<"two");//可以用QStringList()设置列表
23.QActions
简单得没什么可说的
## 24.QSlider and QProgressBar
这个也是简单...
## 25.QStatusBar
对话框
#include<QtCore>
#include<QtGui>
action添加:
ui->statusBar->showMessage("hello");//可选参数时间,如果太短就不能观察到
为了可以永久看到提示信息,需要在对应对话框的头文件中加入:
#include<QtCore>
#include<QtGui>
并在里面加两个指针变量:
private:
QLabel *Statlabel;
QProgressBar *StatProgress;
随后,才对应窗口源文件的构造函数中加入:
StatLabel=new QLabel(this);
StatProgress=new QProgressBar(this);
ui->statusBar->addPermanentWidget(StatLabel);
ui->statusBar->addPermanentWidget(StatProgress);

StatLabel->setText("hello");
StatProgress->setTextVisibe(false);
//如果想对StatProgress控件操作的话,则可以在适当的操作位置插入,类似:
StatProgress->setValue(45);
## 26.QMessageBox
简要介绍了QMessageBox::information question warning
## 27.QTimer
Console
加入自写类mytimer,并在对应头文件写入:
#include<QtCore>
源文件写入:
#include<QtCore>
#include<QDebug>
#include<QTimer>
又对mytimer基类调整,为:public QObject(这样才可以正常使用slot)
并加入Myslot()公共成员函数:
void  MyTimer::MySlot()
{
qDebug()<<" Timer excuted";
}
在构造函数中加入:
timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(MySlot()));
timer->start(1000);
这样做有缺点,会导致一直这样执行下去,而不是一次完事.
## 28.QThread part1 creating a thread
Console
MyThread class
<!mythread.h>
...
#include<QtCore>
class MyThread:public QThread
{
public:
MyThread();
void run();
QString name;
};
<!mythread.cpp>
...
#include<QtCore>
#include<QDebug>
MyThread::MyThread()
{

}
void MyThread::run()
{
qDebug()<<this->name<<"is Running";
for(int i=0;i<1000;i++)
{
QMutex mutex;
mutex.lock();//锁死防止被其他线程使用
if(this->Stop)
break;
mutex.unlock();
this->sleep(1);
qDebug()<<this->name<<i;

}
}
<!main.cpp>
#include"mythread.h"
...
MyThread mThread1;
mThread1.name="mThread1";
MyThread mThread2;
mThread2.name="mThread2";
MyThread mThread3;
mThread3.name="mThread3";
mThread1.start();//可选Priority参数(优先级),优先级越高,速度越快(废话)
mThread2.start();
mThread3.start();

29.QThread part2 the Priority
30.QThread part3 the QMutex
## 31.QThread part4 threads with a GUI
这里面有深刻的介绍了信号的连接和发射过程,需要好好的理解一下了
Dialog TextLabel Horizontal Spacer Button(Start,Stop)
new class MyThread base class QThread
<!mythread.h>
signals:
void NumberChanged(int);
public:
void run();
bool Stop;

<!mythread.cpp>
#include<QtCore>
void MyThread::run()
{
for(int i=0;i<10000;i++)
{
QMutex mutex;
mutex.lock();
if(this->Stop)break;
mutex.unlock();

emit NumberChanged(i);

this->msleep(100);//这里是后加的,不然的话会都执行完毕再响应其他事件,无法监测到状态!
}
}
<!dialog.h>
#include"mythread.h"
public:
MyThread *mThread;
public slots:
void onNumberChanged(int);
<!dialog.cpp>
void Dialog::onNumberChanged(intNumber)
{
ui->label->setText(QString::number(Number));
}
Dialog Button加入Clicked slot
回到dialog.cpp
构造函数中+:
mThread=new MyThread(this);
connect(mThread,SIGNAL(NumberChanged(int)),this,SLOT(onNumberChanged(int)));
void Dialog::on_pushButton_clicked()
{
//Started
mThread->start();
}
void Dialog::on_pushButton_2_clicked()
{
//Stopped
mThread->Stop=true;//更改此状态位,以便可以中断run中循环!
}
观影总结:
信号传输流程:
自定义一个类MyThread,其中有一个信号NumberChanged(),在执行run的循环时,每次都被发射(emit)。
在Dialog中使用该类,实例化为mThread,并在Dialog构造函数中new了一个,其parent为this Dialog
随后,将MyThread中的NumberChanged()信号和Dialog中的onNumberChanged()连接,以便NumberChanged的信号可以不断的被onNumberChanged()接收,做出响应。

32.Community Feedback(很垃圾的说!)
33.QThread part5 Waiting
在Console 中的main中加入了wait();
随后还特意在MyThread中加入sleep()让时间更长!
既然是等待那个线程完成,那只有那个线程完成,才能接着操作后续的步骤!
34.Where to Get Qt Creator
## 35.QThread part6 Threading done
这里做的是自己用QObject写的MyObject。。。
```cpp
<!myobject.h>
#include<QDebug>
#include<QThread>
public:
void DoSetup(QThread &cThread);
public slots:
void DoWork();

<!myobject.cpp>
void MyObject::DoSetup(QThread &cThread)
{
connect(&cThread,SIGNAL(started()),this,SLOT(DoWork()));
}
void MyObject::DoWork()
{
for(int i=0;i<100;i++)
{
qDebug()<<"i";
}
}
<!main.cpp>
//主函数中
QThread cThread;
MyObject cObject;
cObject.DoSetup(cThread);
//
cObject.moveToThread(&cThread);
cThread.start();
//他说,这样做,可以是主函数线程跳转至新的线程执行新线程任务。。。
```
## 36.Introducing containers and the QList
QList很好用的,声明QList
QList<int> mList;
mList.append(123);
...
## 37.QListIterator and navigating the QList

```cpp
<!main.cpp>
#include<QList>
#include<QDebug>

//主函数中
QList mList;
for(int i=0;i<100;i++)
{
mList.append(i);
}
QListIterator <int> Iter(List);//迭代器,两种正向+逆向
//第一种写法:正向迭代器
while(Iter.hasNext())
{
qDebug()<< Iter.next();
}
//第二种,反向迭代器
Iter.toBack();
while(Iter.hasPrevious())
{
qDebug()<<Iter.previous();
//第二种Plus:还可以在不移动迭代器的时候查询下一个
/*peek***(本来就是偷窥的意思...)
if(Iter.hasPrevious())
{
qDebug()<<"next..."<<Iter.peekPrevious();
}
*/
}
```

## 38.QMutableListIterator and QList

```cpp
// 依然继续。。。
// 主函数中
QList<int> List;
for(int i=0;i<10;i++)
{
List.append(i);
}
QMutableListIterator<int> Iter(List);//Mutable容易改变的
while(Iter.hashNext())
{
int i=Iter.next();
if(i==5)
{
Iter.remove();//哦,之前说的可以改变就是指可以删除指定元素的迭代器呃...
}
}
Iter.toFront();
while(Iter.hasNext())
{
qDebug()<<Iter.next();
}
```

## 39.QLinkedList
// Console和QList几乎是一样的操作,那 应该就是QList不是真正的链表,这个才是,因此,那个删除元素操作很浪费时间
```c
#include<QLinkedList>
#include<QDebug>

...
QLinkedList<int> List;
List<<1<<3<<5;
foreach(int i,List)
{
qDebug()<<i;
}
...
```
## 40.QMap
// NPP折叠这个功能就先不弄了,太费劲了...
// 依旧Console ,以后不说什么,默认就是console!
QMap<int,QString>Emplyees;//哦,是把字串和整数映射,最后查数肯定比查字串快,这就是Map(映射!)
Emplyees.insert(1,"A");
Emplyees.contains("A");
## 41.QHash
```cpp
// 因此这里有了QHash
char x=1;
```
与QMap区别:
1.查找元素更快;
2.用迭代器检索QMap时,每一项都是排序好的,而QHash则是哈希值,不需要排序,所以这个快
3.操作符不大一样

## 42.QStringList
#inlcude<QStringList>
#include<QDebug>

...
QStringList List;
List.append("Hello");
QString fine="a,b,c,d,e,f,g";
List=fine.split(",");
List.replaceInStrings("b","batman");
QList After=List.join(",");
qDebug()<<After;
foreach(QString item,List)
{
qDebug()<<item;
}
...
//以上都是屁话!


## 43.qSort Algirithm
QList<int> List;
List<<1<<2<<3<<4<<6<<5<<7;
qSort(List);
## 44.qCopy Algirithm
#include<QVector>
QStringList List;
List<<"a"<<"b"<<"c";
QVector<QString> Vect(3);
qCopy(List.begin(),List.end(),Vect.begin());
foreach(QString itm,Vect)
{
qDebug()<<itm;
}
## 45.qFill Algirithm
#include<QDebug>
#include<QVector>
QVector<QString> Vect(5);
qFill(Vect,"Hello");
foreach(QString itm,Vect)
{
qDebug()<<itm;
}
//用C++开发程序的好处是:既可以使用开发套件里面的所谓的库,也可以使用C++自带的标准库函数,以及扩展库,这也是他的强大之处
## 46 qFind Algirithm
QList<int> List;
List<<1<<5<<13<<25;
QList<int>::const_iterator Iter=qFind(List.begin,List.end(),15);
//就是说,qFind可以自适应一些不同的Container(所谓的容器)
if(Iter!=List.end())
{
qDebug()<<"Found"<<*Iter;
}
else
{
qDebug()<<"None Found";
}
## 47.Intro to model view programming
他说Qt 的模态视图编程太好了(比其他的)。。。
模态视图编程:数据->模型->delegate
![](D:/assets/模态视图编程.png)
QDialog
用ListView和QPushtButton来演示的,一个ListView3个QPushButton
分别叫 Add Insert Delete
最后还有一个ComboBox和HorizonalLayout
分别做了clicked的action处理
```cpp
<!dialog.h>
#include<QtCore>
#include<QtGui>
private:
QStringListModel *model;

<!dialog.cpp>
dialog构造函数
model=new QStringListModel(this);
QStringList list;
list<<"Catas"<<"dogs"<<"bird";
model->setStringList(list);
ui->ListView->setModel(model);
ui->ComboBox->setModel(model);
ui->ListView->setEditTriggers(QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked);
//到这里为止,就已经做好了模态程序的雏形,按钮的时间在先面实现
Dialog::on_pushButton_clicked()
{
//add
int row =model->rowCount();//查查有几个项
model->insertRows(row,1);//在最后,插入一项
QModelIndex index=model->index(row);//检索model

ui->ListView->setCurrentIndex(index);
ui->ListView->edit(index);
}
Dialog::on_pushButton_2_clicked()
{
//insert
int row =ListView->currentIndex().row();
model->insertRows(row,1);
QModelIndex index=model->index(row);

ui->ListView->setCurrentIndex(index);
ui->ListView->edit(index);
}
Dialog::on_pushButton_2_clicked()
{
//delete
model->removeRows(ui->listView->currentIndex(row),1);
}
```
## 48.QDirModel and QTreeView
UI:
```UI

QPushButton*2
TreeView*1
HorizontalLayout*1+Horizontal Spacer*1
```
```cpp
<!dialog.h>
#include<QtCore>
#include<QtGui>

private:
QDirModel *model;
<!dialog.cpp>
Dialog::Dialog()
{
model=new QDirModel(this);
model->setReadOnly(false);
model->setSorting(QDir::DirsFirst|QDir::IgnoreCase|QDir::Name);

ui->TreeView->setModel(model);
QModelIndex index=model->index("F:/");
ui->TreeView->expand(index);
ui->TreeView->setCurrentIndex(index);
ui->TreeView->resizeColumeToContents(0);
}
void Dialog::on_pushButton_clicked()
{
//make dir
QModelIndex index=ui->TreeView->currentIndex();
if(!index.isValid())return;
QString name =QInputDialog::getText(this,"Name","Enter a Name");
if(name.isEmpty())return;
model->mkdir(index,name);

}
void Dialog::on_pushButton_2_clicked()
{
//deldir|file
QModelIndex index=ui->TreeView->currentIndex();
if(!index.isValid())return;
if(model->fileInfo(index).isDir())
{//dir
model->rmdir(index);
}
else{//file
model->remove(index);
}
}
```
## 49.QFileSystemModel and simple file explorer example
UI:
```UI
listeView+TreeView+Splitter
```
```cpp
<!dialog.h>
private:
QFileSystemModel *dirmodel;
QFileSystemModel *filemodel;
<!dialog.cpp>
Dialog::Dialog()
{
QString sPath="F:/";
dirmodel=new QFileSystemModel(this);
dirmodel->setFilter(QDir::NoDotAndDotDot|QDir::AllDir);
dirmodel->setRootPath(sPath);
ui->TreeView->setModel(dirmodel);

filemodel=new QFileSystemModel(this);
dirmodel->setFilter(QDir::NoDotAndDotDot|QDir::Files);
dirmodel->setRootPath(sPath);
ui->TreeView->setModel(dirmodel);

ui->listeView->setModel(filemodel);
}
void Dialog::on_treeView_clicked(QModelIndex index...)
{
QString sPath=dirmodel->fileInfo(index).absoluteFilePath();
ui->listeView->setRootIndex(filemodel->setRootPath(sPath));
}
## 50.QItemDelegate delegates in a QTabView
UI:
```UI
tableView
```
添加类:Delegate
Base class:QItemDelegate
Type info:Inherits QObject
<!delegate.h>
#include<QModelIndex>
#include<QObject>
#include<QSize>
#include<QSpinBox>
QWidget *createEditor(QWidget *parent,const QStyleViewItem &option,const QModelIndex &index) const;
void setEditorData(QWidget *editor,const QModelIndex &index) const ;
void setModelData(QWidget *editor,QAbstractItemView) const;

void updateEditorGeometry(QWidget *editor,const QStyleViewItem &option,const QModelIndex &index)const;

#include<QtCore>
#include<QtGui>
private:
QStandardItemModel *model;

..cpp
Dialog::Dialog()
{
model=new QStandardItemModel(4,2, this);
for(int row=0;row<4;++row)
{
for(int col=0;col<2;++col)
{
QModelIndex index=model->index(row,col,QModelIndex());
model->setData(index,0);
}
}
ui->tabView->setModel(model);
}
//到这里只能自己实验了,因为他演示的代码太快了 。。。
现在 最新的版本是Qt5.8.0,这个时候,我一看,新版本的建工程都和原来不一样了,叫直接就叫Qt Widget(原名为 Qt Gui Application)
新版本果然没有就版本好用,尤其是IDE一类,语言现在也是,貌似都倒退了!!!
不行就还是只用Qt4.x.x

没有评论:

发表评论