放一堆c++代码
附件中的代码是我从之前开发的盖莫游戏引擎中扯出来,主要是为了提高代码复用率
另外也希望附件代码对他人有所帮助。
当然如果有什么好的建议也可以告诉我
当然如果有什么好的类似的代码想合并到一起的话也可以找我
关于附件
包含内容有:
1.模板-2,3,4维向量
2.简单的随机数对象
3.日志对象
4.颜色
5.类似MFC-Object的对象一个
6.基于XML的对象序列化框架一个
7.简单的文件系统一个
8.Ini解析对象一个
9.一个小型的信号插槽系统
10.编码处理对象一个
可以自由使用(包含源码)
ps:
a.如果有对代码有好的意见可以提出来.
b.XXX
/Files/gaimor/gCore.zip
这是学习QT的第10篇文章
现在总算入门了
要想快速学习新的知识一个是要多看还有一个是要多练
本篇就是使用QT开发软件的开始
不过只是开始,我并不打算弄一个完完整整的例子
而是通过迭代式的循序渐进的方式一步一步完善软件
所以现在做出来的只是一个毛胚而已
首先上代码:
#include <QtGui/QMainWindow>
QT_BEGIN_NAMESPACE
class QAction;
class QToolBar;
class QMenu;
class QWidget;
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public:
void CreateAction();
void CreateMenu();
void CreateToolBar();
private slots:
void home();
void about();
void setting();
void running();
private:
QMenu* setting_;
QMenu* home_;
QMenu* running_;
QMenu* about_;
QToolBar* settingbar;
QToolBar* homebar;
QToolBar* runningbar;
QToolBar* aboutbar;
QAction* settingaction;
QAction* homeaction;
QAction* runningaction;
QAction* aboutaction;
};
.cpp
本文没有多少新的内容
需要说的2点:
1.qrc文件
这是QT的资源文件
我们可以把图标通过资源文件的方式包含进程序里面
本文的qrc内容如下:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/home.png</file>
<file>images/running.png</file>
<file>images/about.png</file>
<file>images/setting.png</file>
<file>images/logo.png</file>
</qresource>
</RCC>
那么使用的时候就可以这样调用了:
QIcon(":/images/home.png")
注意字符串最前面是一个冒号!
2.menuBar()和addToolBar的问题
menuBar()是QWidget中用于获取控件菜单栏的函数
addToolBar是增加工具条到控件的函数如果没有调用menuBar也没有调用addToolBar那可以认为控件是又没菜单项和工具条的
在这里我的感觉是既然menuBar是获取控件菜单项的函数,那为什么没有对应的toolBar?或者有addToolBar而无对于德addMenu?
从命名风格上上看我们还是希望程序命名尽可能一致的,这样可以减少使用者的记忆量。
--------当然这也行有这样写的理由
3.QT中打开给定网页链接的方法:
const QUrl url("http://www.cppblog.com/gaimor/");
QDesktopServices::openUrl(url);
3.至于本程序文最终界面如下:
可以看出由于没有设置其他控件 导致程序界面没有被展开
这是第9篇学习QT的例子
本文主要学习自带的Dock Widget例子
这个例子主要包含以下QT控件
1.Dock
2.Menu
3.ToolBar
1.看看例子还是说
QMainWindow吧
什么是QMainWindow?
A main window provides a framework for building an application's user interface. Qt has QMainWindow and its related classes for main window management. QMainWindow has its own layout to which you can add QToolBars, QDockWidgets, QDockBars,QDockWidgets, a QStatusBar. 总而言之:QMainWindow提供构建应用程序接口的框架。QMainWindow提供独有的布局结构以便于用户加入QToolBar,QDockWidgets,QDockBars和QStatusBar.
2.使用自定义对象从QT对象继承的方法
除了必要的 :public QTObject
还要加入宏Q_OBJECT
如果必要加入槽,信号函数
一个例子是:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
private slots:
void newLetter();
void save();
void print();
void undo();
void about();
void insertCustomer(const QString &customer);
void addParagraph(const QString ¶graph);
3.状态栏
设置状态栏信息的函数
例子:
statusBar()->showMessage(tr("Ready"));
4.文件打开和保存对话框
QString fileName = QFileDialog::getSaveFileName(this,
tr("Choose a file name"), ".",
tr("HTML (*.html *.htm)"));
5.再说下QAction
newLetterAct = new QAction(QIcon(":/images/new.png"), tr("&New Letter"),
this);
newLetterAct->setShortcuts(QKeySequence::New);
newLetterAct->setStatusTip(tr("Create a new form letter"));
connect(newLetterAct, SIGNAL(triggered()), this, SLOT(newLetter()));
通过调用setStatusTip可以设置action提示信息
6.
QTextDocument对象
原文解释:
The QTextDocument class holds formatted text that can be viewed and edited using a QTextEdit.
通过QTextEdit的document可以获取QTextDocument对象
假定需要响应文档撤销事件
一个可能的例子就是:
void MainWindow::undo()
{
QTextDocument *document = textEdit->document();
document->undo();
}
7.QTextCursor
The QTextCursor class offers an API to accDuess and modify QTextDocuments.
我们就可以得出QTextCursor访问和修改QTextDocument,QTextDocumnt显示QTextEdit内容文本。
8.QDockWidget
The QDockWidget class provides a widget that can be docked inside a QMainWindow floated as a top-level window on the desktop.关于Dock的用法如下:
设置Dock为左右结构
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
设置Dock内容控件
dock
->setWidget
(customerList
);
把这个dock放在窗体右边
addDockWidget
(Qt::RightDockWidgetArea
, dock
);
9.这个例子还有其他的对象比如QListWidget以后再看吧
不过这一篇感觉有几个疑惑的地方
比如:
QDockWidget *dock = new QDockWidget(tr("Customers"), this);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
customerList = new QListWidget(dock);
customerList->addItems(QStringList()
<< "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
<< "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
<< "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
<< "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
<< "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
<< "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
dock->setWidget(customerList);
addDockWidget(Qt::RightDockWidgetArea, dock);
viewMenu->addAction(dock->toggleViewAction());
dock = new QDockWidget(tr("Paragraphs"), this);
其中的dock new了2次并没有调用相应的delete.
不知道QT具体是如何实现的
另外在QT的例子中在程序结束的时候并没有销毁new出来的指针
不知道QT有内在机制保证内存不会泄露还是?
QT学习笔记-8.查找文件对话框
只所以选择这个QT自带的例子有2个原因
1是界面简单容易理解
2是当点击more按键会动态改变窗体出现高级选项(我想知道这个是如何做到的)
基本代码如下:
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
class QCheckBox;
class QDialogButtonBox;
class QGroupBox;
class QLabel;
class QLineEdit;
class QPushButton;
QT_END_NAMESPACE
class FindDialog : public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget *parent = 0);
private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *fromStartCheckBox;
QCheckBox *wholeWordsCheckBox;
QCheckBox *searchSelectionCheckBox;
QCheckBox *backwardCheckBox;
QDialogButtonBox *buttonBox;
QPushButton *findButton;
QPushButton *moreButton;
QWidget *extension;
};
#endif
.cpp
#include <QtGui>
#include "finddialog.h"
FindDialog::FindDialog(QWidget *parent)
: QDialog(parent)
{
label = new QLabel(tr("Find &what:"));
lineEdit = new QLineEdit;
//! 这个成员函数的作用是当点击控件快捷键则把响应发送到Buddy控件
label->setBuddy(lineEdit);
caseCheckBox = new QCheckBox(tr("Match &case"));
fromStartCheckBox = new QCheckBox(tr("Search from &start"));
fromStartCheckBox->setChecked(true);
findButton = new QPushButton(tr("&Find"));
findButton->setDefault(true);
moreButton = new QPushButton(tr("&More"));
moreButton->setCheckable(true);
//moreButton->setAutoDefault(false);
//! 又是对话框按钮盒,不过这次使用和上次有点区别 其子按钮是加上去的
buttonBox = new QDialogButtonBox(Qt::Vertical);
buttonBox->addButton(findButton, QDialogButtonBox::ActionRole);
buttonBox->addButton(moreButton, QDialogButtonBox::ActionRole);
extension = new QWidget;
wholeWordsCheckBox = new QCheckBox(tr("&Whole words"));
backwardCheckBox = new QCheckBox(tr("Search &backward"));
searchSelectionCheckBox = new QCheckBox(tr("Search se&lection"));
//! 绑定时间(需要注意的是SINGLA,SLOT中的函数必须是形式完备的)
connect(moreButton, SIGNAL(toggled(bool)), extension, SLOT(setVisible(bool)));
//! 扩展控件部分(使用QVBox布局)
QVBoxLayout *extensionLayout = new QVBoxLayout;
extensionLayout->setMargin(0);
extensionLayout->addWidget(wholeWordsCheckBox);
extensionLayout->addWidget(backwardCheckBox);
extensionLayout->addWidget(searchSelectionCheckBox);
extension->setLayout(extensionLayout);
//! 文本框和搜索键
QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);
//! 辅助控件组
QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(fromStartCheckBox);
leftLayout->addStretch(1);
//! 主布局使用格子管理器
QGridLayout *mainLayout = new QGridLayout;
//! 设置大小不能更改
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
//! 把LeftLayout管理器放在左上角即0,0位置处
mainLayout->addLayout(leftLayout, 0, 0);
mainLayout->addWidget(buttonBox, 0, 1);
mainLayout->addWidget(extension, 1, 0);
setLayout(mainLayout);
setWindowTitle(tr("Extension"));
extension->setVisible(false);
}
需要说明的是
#include <QtGui>是包含所有的GUI控件头文件
我们不再需要
#include <QLabel>
#include <QEdit>
不过看看代码还真应了那句话复杂界面都是布局管理器堆积出来的
另外注意这句话
mainLayout->addWidget(extension, 1, 0);
把extension放在格子管理器的1,0位置
如果注销掉这句话可以看看出来的界面是什么样子的
最后要说的就是extension->setVisible(false);
在开始我们把exntension控件设置为隐藏状态
当然也可以使用函数hide().
由于之前绑定了more按键和extension,
我们就可以通过点击more按键来显示和隐藏extension控件了
摘要:
阅读全文
1.QString
在c++标准库中有2种类型的字符串char*和std::string
QT则提供了对象QString
QString除了具备字符串对象一般功能函数之外还提供了自己特有的功能比如:
str.sprintf("%s %.1f%%", "perfect competition", 100.0); ---格式化输出
当然也可以使用匿名形式
str = QString("%1 %2 (%3s-%4s)").arg("permissive").arg("society").arg(1950).arg(1970);
%1,%2,%3是占位符
另外QString还提供了一系列类型类型装换函数比如:
str = QString::number(59.6);
str.setNum(59.6);
当然还有其他功能
下面是具体的测试例子:
#include <QtCore/QCoreApplication>
#include <QString>
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str;
str.append("Hello QT");
qDebug()<<str.left(3);
qDebug()<<str.right(3);
qDebug()<<str.mid(2,2);
qDebug()<<str.mid(2);
qDebug()<<str.indexOf("QT");
qDebug()<<str.startsWith("Hello");
qDebug()<<str.toLower();
str.replace(" ","O(∩_∩)O~");
qDebug()<<str;
str.insert(0,"....");
qDebug()<<str;
str.remove(0,3);
qDebug()<<str;
str = QString("%1%2%3").arg("1").arg(2).arg("3");
qDebug()<<str;
return a.exec();
}
当然还有其他它功能
2.QByteArray
QByteArray是比特数组
为了掌握它的基本功能还是测试下功能大致就知道了
#include <QtCore/QCoreApplication>
#include <QByteArray>
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray arr;
arr.append("123");
qDebug()<<arr.at(2);
arr = "lots\t of\nwhitespace\r\n ";
qDebug()<<arr;
qDebug()<<arr.simplified();
qDebug()<<arr;
arr.chop(3);
qDebug()<<arr;
qDebug()<<arr.count();
qDebug()<<arr.isEmpty();
qDebug()<<arr.isNull();
arr.fill(244,10);
qDebug()<<arr;
return a.exec();
}
接上文,这篇学学QT中基本控件的使用和QApplication对象
1.什么是QApplication?
文档说明:
The QApplication class manages the GUI application's control flow and main settings.
Application类管理GUI程序控制流和主要参数设置
QApplication继承于QCoreApplication。后者提供了控制台程序的事件流
2.基本控件的使用例子:
#include <QApplication>
#include <QLabel>
#include <QPalette>
#define QT_HTML
QLabel* label = NULL;
void initlabel()
{
#ifndef QT_HTML
label = new QLabel("Hello Qt!");
#else
label = new QLabel("<h2><i>Hello</i><font color=red>Qt!</font></h2>");
#endif
//! set size
label->setBaseSize(64,48);
//! set alignment
label->setAlignment(Qt::AlignHCenter);
//! sht background color
QColor bk(100,100,125);
QPalette palette(bk);
label->setPalette(palette);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.setApplicationName("QT Test");
initlabel();
label->show();
return app.exec();
}
QLabel是QT中的标签控件它具有控件的一般属性比如设置大小setBaseSite,设置对齐格式,当然也可以设置背景色或者图片-这都是通过QPalette调色板来实现的
需要说明的是QT中的控件文本可以使用Html语法的文本来操作具体如上。
那觉这个功能比较给力!
3.那么什么是QPalette?
QPalette负责控制控件状态的颜色组-注意是控件状态。
那么对一个控件每个状态的颜色都可以是不一样的咯
至于QPalette的详细功能和使用方法以后需要的时候再看吧
4.基本的信号链接使用例子
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton *button = new QPushButton("Quit");
//! when click button, app exit.
QObject::connect(button, SIGNAL(clicked()),&app, SLOT(quit()));
button->show();
return app.exec();
}
5.一个复杂点的例子
#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>
#include <QIcon>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget* widget = new QWidget;
QIcon icon("config.png");
widget->setWindowIcon(icon);
widget->setWindowTitle("Using QT");
QSlider* slider = new QSlider(widget);
slider->setRange(0,99);
QSpinBox* spinbox = new QSpinBox(widget);
spinbox->setRange(0,99);
widget->show();
return app.exec();
}
编译运行可以看出QWidget中默认的布局管理器是竖直向下排列的
在QT中可以通过setWindowIcon来设置窗体图标
通过setWindowTitle设置窗体标题
6.加上布局管理器和信号连接的话代码大致应该是这个样子
#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>
#include <QIcon>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget* widget = new QWidget;
QIcon icon("config.png");
widget->setWindowIcon(icon);
widget->setWindowTitle("Using QT");
QSlider* slider = new QSlider(widget);
slider->setRange(0,99);
QSpinBox* spinbox = new QSpinBox(widget);
spinbox->setRange(0,99);
QHBoxLayout* layout = new QHBoxLayout;
layout->addWidget(spinbox);
//! adjust slider's direction
slider->setOrientation(Qt::Horizontal);
layout->addWidget(slider);
spinbox->setValue(28);
//! connect signals and slots
QObject::connect(spinbox, SIGNAL(valueChanged(int)),slider,SLOT(setValue(int)));
QObject::connect(slider,SIGNAL(valueChanged(int)),spinbox,SLOT(setValue(int)));
widget->setLayout(layout);
widget->show();
return app.exec();
}
需要说明的是在这里QSlider,QPinBox控件是互动
编译程序并运行界面如下:
这是关于QT的第六篇笔记
总结下吧
QT功能还是很强大贴心的
比较容易上手
不过有2点我感觉不大舒服的地方是对这个变量命名格式有点不大喜欢
比如setValue我喜欢写成SetValue.
仅此而已
本文涉及QT中的容器对象系列
一容器
QVector类似stl中的vector插入尾部数据速度很快
基本例子如下:
QVector<double> vect(3);
vect[0] = 1.0;
vect[1] = 0.540302;
vect[2] = -0.416147;
这样也可以
QVector<double> vect;
vect.append(1.0);
vect.append(0.540302);
vect.append(-0.416147);
另外也可以通过流
vect << 1.0 << 0.540302 << -0.416147;
2.QLinkedList没有提供[]操纵
随机访问速度很慢
3.QList<T>序列容器是一种数组链表它具有前2者的大部分操作支持随机访问
在容器头部尾部插入数据很迅速
4.QStringList是QList<QString>的子类提供以下操作
排序,过滤,正则表达式处理等
5.QStack<T> 提供push,pop,top等操作
6.Queue<T> QT的队列模板
7.QMap<T,V>
基本操作如下:
QMap<QString, int> map;
map.insert("eins", 1);
map.insert("sieben", 7);
map.insert("dreiundzwanzig", 23);
当然也可以这样插入数据
map["eins"] = 1;
map["sieben"] = 7;
map["dreiundzwanzig"] = 23;
但是这样做有一个问题那就是会生成空值
为了不出现这样的结果可以使用成员函数value()来代替[]来获取数据,如果对于键不存在则返回默认的对象值
8.QHash<T,V> 使用散列存储键值对
二通用算法
需要说明的是QT中的容器是stl风格的,这意味着可以使用Stl中的算法。
当然在QT库中QtAlgorithm文件包含了基本的算法模板
主要的函数有
qFind-查找给定元素在容器中的位置类似std::find
qBinaryFind - 类似qFind 需要查找元素有序排列
qFill-类似std::fill 使用给定元素填充容器
qCopy,qSort..
qDeleteAll-函数对容器中的每个元素做删除处理
基本的容器和算法就这么多了
其实熟悉stl的话学习这个上手很快的
本文主要是对C++ GUI Programming with Qt4一书 Signals and Slots in Depth 部分的翻译
信号与插槽机制是Qt编程的基础.它可以绑定对象而不需要对象之间彼此了解。
槽类似于c++中的成员函数他可以是虚拟的,可重载的,私有的,公开的,受保护的。
不同点式槽可以链接到信号。通过这种方式可以在每次信号发射的的时候做到调用槽函数
connect()语句是这样的
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
在这里sender和receiver是指向信号对象和槽对象的指针。宏SIGNAL()和SLOTS()负责转换他们的参数到字符串。
当然一个信号可以连接到多个槽(似乎都是这样的)
connect(slider, SIGNAL(valueChanged(int)),
spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)),
this, SLOT(updateStatusBarIndicator(int)));
同样多个信号可以连接到单个槽
例如:
connect(lcd, SIGNAL(overflow()),
this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()),
this, SLOT(handleMathError()));
除此之外信号可以连接到其他信号(见过的其他插槽系统似乎不大可以?)
connect(lineEdit, SIGNAL(textChanged(const QString &)),
this, SIGNAL(updateRecord(const QString &)));
需要指出的是信号信号链接和信号插槽连接时不同的
既然信号和插槽可以连接那么他们应该可以断开,如下:
disconnect(lcd, SIGNAL(overflow()),
this, SLOT(handleMathError()));
一个简单的例子:
class Employee : public QObject
{
Q_OBJECT
public:
Employee() { mySalary = 0; }
int salary() const { return mySalary; }
public slots:
void setSalary(int newSalary);
signals:
void salaryChanged(int newSalary);
private:
int mySalary;
};
void Employee::setSalary(int newSalary)
{
if (newSalary != mySalary) {
mySalary = newSalary;
emit salaryChanged(mySalary);
}
}
说明
关键字 public slots:和signals
他们用于修饰插槽函数和信号函数
至于信号的反射通过关键字 emit来实现
通过本文基本掌握了QT的信号插槽机制
QT自带的例子Codecs是一篇关于保存和载入不同编码文本的例子
其界面比较简单一个简单的单文档而已
有2个主要的对象
一个是MainWindow用于窗体主界面
另外一个是PreviewForm用于显示编码格式列表
1.其编码格式的获取部分代码如下:
QMap<QString, QTextCodec *> codecMap;
QRegExp iso8859RegExp("ISO[- ]8859-([0-9]+).*");
foreach (int mib, QTextCodec::availableMibs()) {
QTextCodec *codec = QTextCodec::codecForMib(mib);
QString sortKey = codec->name().toUpper();
int rank;
if (sortKey.startsWith("UTF-8")) {
rank = 1;
} else if (sortKey.startsWith("UTF-16")) {
rank = 2;
} else if (iso8859RegExp.exactMatch(sortKey)) {
if (iso8859RegExp.cap(1).size() == 1)
rank = 3;
else
rank = 4;
} else {
rank = 5;
}
sortKey.prepend(QChar('0' + rank));
codecMap.insert(sortKey, codec);
}
codecs = codecMap.values();
通过使用foreach循环来获取支持的编码格式并保存
不过看上去
foreach (int mib
, QTextCodec::availableMibs
())有点奇怪
查查资料
解释是foreach(variables ,container)关键字是Qt对c++的一个扩展,主要用于按顺序历经容器(container)中的对象
2关于文件菜单的生成和设置
菜单的构造
一个例子
saveAsMenu
= new QMenu(tr
("&Save As"), this);这里有2个参数一个是菜单显示文另外一个是当前窗体指针
然后就可以加载子菜单,设置分隔符,设置事件响应等操作了
例子为:
fileMenu = new QMenu(tr("&File"), this);
fileMenu->addAction(openAct);
fileMenu->addMenu(saveAsMenu);
fileMenu->addSeparator();
fileMenu->addAction(exitAct);
那如何绑定菜单到当前窗体呢
如下:
menuBar()->addMenu(fileMenu);
menuBar()->addSeparator();
menuBar()->addMenu(helpMenu);
menuBar()是QmainWindow的成员函数用于获取窗体菜单项指针
3.QT对象QAction
QT文档对QAction的解释是可以抽象用户接口对象-可以插入控件
例子如下:
openAct = new QAction(tr("&Open"), this);
openAct->setShortcuts(QKeySequence::Open);
connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
无非就是对象声明,设置快捷键,链接函数和响应而已
4.窗体设置
setWindowTitle
(tr
("Codecs"));
resize(500, 400);
5.消息对话框
QMessageBox::about(this, tr("About Codecs"),
tr("The <b>Codecs</b> example demonstrates how to read and write "
"files using various encodings."));