Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿

学习QT的一个原因是貌似QT做出来的界面比较绚丽
我倒想看看能做出来啥样子的

从QT窗体布局说起
凡是窗体布局无非就是如何摆放的问题
1.想当然如果摆放有2个方式一个是所见即所得,一个是使用布局管理器
先说后者吧
2.QT有好几种布局管理器无非就是啥子流式布局,格子布局等等
从这个层级上说软件界面都是布局嵌套的
3.布局和控件的关系
   一般是一个布局对应于一个控件容器(或者顶层控件)
   使用当前布局管理器加挂子控件(容器)即可
然后给当前控件挂上布局管理器即可
下面是一个简单的QT Layout的例子(从QT例子改的)
class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog();
private:
    
void createHorizontalGroupBox();

    
enum {button_number = 4};
    QGroupBox 
*groupbox;
    QPushButton 
*buttons[button_number];
    QDialogButtonBox 
*buttonBox;
};
实现如下:
#include <QtGui>

#include 
"dialog.h"

//! [0]
Dialog::Dialog()
{
    createHorizontalGroupBox();

    buttonBox 
= new QDialogButtonBox(QDialogButtonBox::Ok
                                     
| QDialogButtonBox::Cancel);

    connect(buttonBox, SIGNAL(accepted()), 
this, SLOT(accept()));
    connect(buttonBox, SIGNAL(rejected()), 
this, SLOT(reject()));

    QVBoxLayout 
*mainLayout = new QVBoxLayout;
    mainLayout
->addWidget(groupbox);
    mainLayout
->addWidget(buttonBox);
    setLayout(mainLayout);

    setWindowTitle(tr(
"LayoutTest"));
}

void Dialog::createHorizontalGroupBox()
{
    groupbox 
= new QGroupBox(tr("Layout Test"));
    QHBoxLayout 
*layout = new QHBoxLayout;

    buttons[
0= new QPushButton(tr("Button1"));
    buttons[
1= new QPushButton(tr("Button2"));
    buttons[
2= new QPushButton(tr("Button3"));
    buttons[
3= new QPushButton(tr("Button4"));

    
for(int i = 0;i<button_number;i++)
        layout
->addWidget(buttons[i]);
    groupbox
->setLayout(layout);
}

几个知识点:
1.groupbox = new QGroupBox(tr("Layout Test"));
Layout Test 是个文本这个无须解释
那tr呢?查查资料知道是为了支持多语言
先知道即可以后使用的话在具体查查吧
2.QDialogButtonBox是个什么东西
   看看最终的程序界面吧
   原来是对话框的确认和取消按钮
    再看信号槽函数无非就是绑定按钮到操作函数
    connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
    connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
    那accepted和accept函数有啥区别?
    看看文档
    accept函数的解释是:
Hides the modal dialog and sets the result code to Accepted
  accpeted函数的解释是:
This signal is emitted when the dialog has been accepted either

在说说QT皮肤
学习QT的主要目的就是想做做脸蛋好看好的软件界面
那就试试看吧
查到的QT有一个名叫QSS(CSS?)的文件可以原来换肤
那就改改看吧
#include <QApplication>
#include 
<QFile>
#include 
<QStyleFactory>
#include 
<QTextStream>
#include 
"dialog.h"

void setSkin(QApplication* const app, QString const &skinFile);

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    setSkin(
&app ,"skin.qss");
    Dialog dialog;
    dialog.show();
    
return app.exec();
}

void setSkin(QApplication* const app, QString const &skinFile)
{
    QFile qss(skinFile);
    qss.open(QFile::ReadOnly);
    app
->setStyleSheet(qss.readAll());
    qss.close();
}
相应的QSS文件如下:
 QPushButton 
 
{
    color
:red;
    background
:url(setting.png)
 
}
这里把PushButton的文本颜色设置为红色
同时把它的背景设置为图片stting.png

完了
PS:如果学习新知识?
囫囵吞枣比较适合快速学习

posted @ 2011-03-13 12:08 ccsdu2009 阅读(5429) | 评论 (2)编辑 收藏
 
说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面
所以现在想认认真真的学习一个c++图形界面框架库
本来想学习Xwidget但是这个资料不大好找 有啥问题不好解决
那就学习QT吧

不说QT的优缺点,不说如何编译QT
从QT的主要库类开始吧
知道了基本的对象之后如果需要学习看看文档就知道了
如果需要编译QT的话再下个代码试着编译吧

QApplication 应用程序类                管理图形用户界面应用程序的控制流和主要设置
QLabel 标签类                                提供文本或者图像的显示
QPushButton 按钮类                      提供了命令按钮 按钮的一种
QButtonGroup 按钮组合类              按钮组 相关按钮的组合
QGroupBox 群组类                         一个有标题的组合框
QDateTimeEdit 日期时间编辑框类  
QLineEdit 行编辑框类                     单行文本编辑器
QTextEdit 文本编辑框类                  单页面多信息编辑器对象
QComboBox 组合框类
QProgressBar 进度条类
QLCDNumber 数字显示框类
QScrollBar 滚动条类
QSpinBox 微调框类
QSlider 滑动条类
QIconView 图标视图类
QListView 列表视图类
QListBox 列表框类
QTable 表格类
QValidator 有效性检查类
QImage 图像类
QMainWindow 主窗口类
QPopupMenu 弹出性菜单类
QMenuBar 菜单栏类
QToolButton 工具按钮类
QToolTip 提示类
QWhatsThis 这是什么类
QAction 动作类
QHBoxLayout 水平布局类
QVBoxLayout 垂直布局类
QGridLayout 表格布局类

QT对话框类
QMessageBox 消息对话框类
QProgressDialog 进度条对话框类
QWizard 向导对话框类
QFileDialog 文件对话框类
QColorDialog 颜色对话框类
QFontDialog 字体对话框类
QPrintDialog 打印对话框类

基本就这些对象了
要系统学习QT 还需要看看QT的slot系统,QT库类接口等
具体的学习就是看例子咯

posted @ 2011-03-12 14:37 ccsdu2009 阅读(1178) | 评论 (0)编辑 收藏
 
1.boost 这个使用的人多不多说了
2.pthread windows下的posix线程实现
3.libcurl 一个有名的开源网络爬虫库 阿里旺旺中使用到了
4.libeay32 OpenSSL Library
5.libtidy 一个专门解析htm的库
6.zlib 这个鬼都知道
7.freetype c接口的type2字体处理库
8.libmad 一个编解码mp3的库
9.libogg,等 一个编解码ogg音频格式的库
10.libsnd 一个开源的编解码十多种音频格式的库
11.ffmpeg 一个关于音频视频处理的库
12.Freeimage,Cximage,Devil 这3个都是用来处理图形的库
13.libpng,libjpeg,....基本同上
14.angelscript 一个类似lua的脚本引擎 其脚本风格类似于标准c语言
15.flac/flac++一个编解码flac音频格式的库
16.tinyxml,rapidxml,libxml 都是关于xml解析方面的
17.luaplus,luabind都是涉及绑定lua和c++的库
18.ode,bullet 开源的物理引擎库
19.timidity一个可以把mid音频格式转化为wav格式的库
20.vlc一个类似ffmeg的库
21.zthread一个类型boost-thread,pthread的c++风格的多线程库
22.sigc++,sigslot信号插槽库 类型的有boost中的signal
23.SDL 简单的音频视频库
24.hge一个简单的使用ddraw的2维游戏小引擎
25.opencv一个开源的处理图形的库
26.mygui,cegui 都是游戏上使用的GUI系统
27.鬼火游戏引擎,Orge,都是开源的游戏中间件
28.Wxwidget一个开源的跨平台,类似MFC
29.QT ..
30.loki一个实验性质的c++库
31.ace一个网络通信库
32.fmod一个有点名气的游戏音效引擎
33.sqlite 一个开源的桌面数据库

未完待续

posted @ 2011-03-11 19:52 ccsdu2009 阅读(19435) | 评论 (12)编辑 收藏
 
libtidy是一个开源的用来诊断,分析,生成html文档的一个库
下面的例子是使用libtidy获取页面链接的例子
代码如下:
#ifndef PARSEPAGE_HPP
#define PARFSPAGE_HPP
#include 
<string>
#include 
<vector>
#include 
<tidy/buffio.h>
#include 
<tidy/fileio.h>
#include 
<tidy/tidy.h>
#include 
<tidy/tidyenum.h>
#include 
<tidy/platform.h>

//! 解析html页面 
class ParsePage
{
public:
    typedef std::vector
<std::string> String;
public:
    ParsePage(
int rank = 0,const std::string& cur = ""):rank(rank),cur(cur)
    {
        doc 
= tidyCreate();
        root 
= tidyGetRoot(doc);
    }
    
~ParsePage()
    {
        tidyRelease(doc);
    }
public:
    
//! 解析给定文件
    bool LoadFile(const char* file)
    {    
        
return 1 == tidyParseFile(doc,file);
    }
    
//!解析给定内存
    bool LoadBuffer(const char* buffer)
    {   
        
return 1 == tidyParseString(doc,buffer);
    }
    
//! 内容解析
    void Check()
    {   
        CheckHref(root);
    }
    
//! 获取链接
    int GetLinkNumber()const{return links.size();}
    std::
string GetLinkByIndex(int index){return links.at(index);} 
private:
    
void DoHref(TidyAttr attr);
    
void CheckHref(TidyNode node);
private:
    TidyDoc     doc;
    TidyNode    root;
    std::
string cur;
    
int         rank;
    String      links;
};

#endif
//! ccsdu2004
实现:
#include <boost/algorithm/string.hpp>
#include 
"parsepage.hpp"

void ParsePage::DoHref(TidyAttr attr)
{
    std::
string href(tidyAttrValue(attr));
    
//! 邮箱地址
    if(boost::algorithm::starts_with(href,"mailto:"))
    {
    }
    
//! 链接地址
    else
    {
        
if(boost::algorithm::starts_with(href,"http:"))
        {
            size_t itr 
= href.find_last_of('#');
            
if(itr != std::string::npos)
            {
                href 
= href.substr(0,itr);
            }
        }
        
else
        {   
            
if(boost::algorithm::contains(href,"#"))
                
return;
        }
    
        links.push_back(href);
    }
}

void ParsePage::CheckHref(TidyNode node)
{
    TidyNode child;
    
for(child = tidyGetChild(node);child;child = tidyGetNext(child))
    {
        TidyAttr attr 
= tidyAttrGetHREF(child);
        
if(attr)
        {
            DoHref(attr);
        }
        CheckHref(child);
    }
}
这个对象比较简单
调用Check之后所有的页面链接在links中

posted @ 2011-03-11 19:29 ccsdu2009 阅读(2005) | 评论 (0)编辑 收藏
 
如何写出高质量的函数?
根据个人经验具体如下:
有遗漏请补充
1.从函数功能上考虑要求函数功能单一不能一个函数基本多个功能
2.从命名规则上考虑应该变量,函数命名统一具体根据各个单位有所差异
3.从易读性上考虑
      一般函数应该写出函数描述,
      为了能使函数简单明了函数行数不宜太长以50行为宜
      函数应该以单一返回路径为佳
4.从变量上考虑应该尽可能使用局部变量而非全局变量
5.从函数健壮性上考虑函数应该输入参数是否为可能的合法值等等
6.从容错性上考虑需要注意异常处理
7.另外还需要考虑函数中的变量是否可能会超出其表示范围.
8.其他....

posted @ 2011-03-10 10:13 ccsdu2009 阅读(1948) | 评论 (4)编辑 收藏
 
一道中兴笔试题
要求是抠出给定字符串中的所有数字然后排序输入
做法如下:
#include <cstdlib>
#include 
<iostream>
#include 
<string.h>
#include 
<ctype.h>
#include 
<algorithm>
#include 
<iterator>

using namespace std;

void output(char* str,int len)
{  
   
if(str == NULL || len <= 0)
       
return
   
int* data = (int*)malloc(len);
   
char* tmp = (char*)malloc(len+1);
   memset(data,
0,len);
   memset(tmp,
0,sizeof(char)*len);
   
int index = 0;
   
int i = 0;
   
int j = 0;
   
int flag = isdigit(str[0]);
   
   
while(1)
   {  
      
if(i==len || i+== len+1)
          
break;   
      
if(isdigit(str[i+j]) == 0 && flag == 0)
      {   
          i
=i+j+1;
          j
=0;
          flag 
= isdigit(str[i+j]);       
      } 
      
else if(isdigit(str[i+j]) == 0 && flag != 0)
      {   
          memset(tmp,
0,sizeof(char)*(len+1));  
          strncpy(tmp,str
+i,j);
          data[index
++= atoi(tmp);
          flag 
= 0;
      }  
      
else
      {
          j
++;       
      }    
   }
   
   std::sort(data,data
+index);
   std::copy(data,data
+index,std::ostream_iterator<int>(std::cout," "));
   free(tmp);
   free(data);       
}

int main(int argc,char *argv[])
{   
    
char input[] = "33k&99+r5sw1f10gd4vc511gc3";
    output(input,strlen(input));
    system(
"PAUSE");
    
return EXIT_SUCCESS;
}
严格说来不应该使用stl中的函数和模板但是为了简便起见还是这么写吧
 
另外一直我一直己写strcpyn函数用于复制给定字符串没发现库中有一个类型的strncpy函数

posted @ 2011-03-10 10:01 ccsdu2009 阅读(2127) | 评论 (1)编辑 收藏
 
1.获取错误 wavOutGetErrorText
static const char * mmerror(MMRESULT mmrError)
{
  
static char mmbuffer[1024];
  
int len;
  sprintf(mmbuffer,
"mm:%d ",(int)mmrError);
  len 
= (int)strlen(mmbuffer);
  waveOutGetErrorText(mmrError, mmbuffer
+len, sizeof(mmbuffer)-len);
  mmbuffer[
sizeof(mmbuffer)-1= 0;
  
return mmbuffer;
}
2. 检取系统中存在的波形输出设备的数量
int wavmax = waveOutGetNumDevs();
3.查询一个指定的波形输出设备以确定其性能
MMRESULT mmres = waveOutGetDevCaps(i, &caps, sizeof(caps));
if(mmres == MMSYSERR_NOERROR)
{
}

使用winmm播放音频的例子具体可以参考:libhao具体请google.
4.打开一个波形输出设备
  MMRESULT mmres;
  mmres = waveOutOpen(&hwo,id,&wavefmt.Format,(DWORD_PTR)0,(DWORD_PTR)device,CALLBACK_NULL|WAVE_ALLOWSYNC);
  if(mmres == MMSYSERR_NOERROR)
  {
  }
  else
  {
  }
5.获取
波形输出设备的标识符
MMSYSERR_NOERROR == waveOutGetID(hwo,&id)
6.关闭波形输出设备
waveOutClose(hwo)
7.设置,清除波形缓冲区
waveOutPrepareHeader
waveOutUnprepareHeader
8.向波形发送数据块
mmres = waveOutWrite(hwo,&wh,sizeof(WAVEHDR));
为查询函数如何使用最好的办法就是使用google code

posted @ 2011-03-01 20:20 ccsdu2009 阅读(892) | 评论 (0)编辑 收藏
 
本着严肃,认真的态度 打算开发新版的Gaimo Audio Library(版本一定要大于2.0.0)
打算重新书写所有内容
基本考虑如下:
1.不再使用openal音频库,也不打算使用Dsound代替之
而打算使用winmm(这样接近底层,win32下)
2.不再声称支持各种格式的音频文件而使用自定义音频格式或者使用pcm或wav格式
3.新版SDK可能增加一个简单的audio convertor以方便转换音频格式
4.新版SDK将增加打算的音频音效算法(reverb,ring等.)
5.使用c++书写,基于c借口以方便跨语言使用者
6.良好的跨平台特性
7.以fmod为目标

题外话:
如果你对这个感兴趣可以联系我以作为一个业余爱好
(仅仅业余的:-O)

posted @ 2011-03-01 19:24 ccsdu2009 阅读(2130) | 评论 (7)编辑 收藏
 
FontForge是一个开源的工业字体库
本文讲述在win32下编译他的流程
1.下载fontforge_full-20100501.tar.bz2
2.下载cygwin 安装包
3.以默认配置安装cygwin
4.以默认方式安装的cygwin还缺少一些库还需要安装下列对象
   x11,zlib,freetype等等
5.或者如果不知道那些包需要安装那就全部安装吧  虽然笨一点但是很有效!
6.解压fontforge到cygwin下的prj目录
7.点击cygwin切换目录到fontfogre下
8.执行/configure
9.make install
10.等待n久
11.检查编译结果

posted @ 2011-01-13 10:21 ccsdu2009 阅读(1288) | 评论 (0)编辑 收藏
 
这段时间没咋编程序
就写个c++排列组合函数的使用吧
以后使用得着的
#include <iostream>
#include 
<vector>
#include 
<algorithm>
#include 
<boost/assign.hpp>
#include 
<boost/function.hpp>

using namespace std;
using namespace boost;
using namespace boost::assign;

inline 
void print_(int t){cout<<t<<" ";}
inline 
void print(vector<int>& vec)
{
    for_each(vec.begin(),vec.end(),print_);
    cout
<<endl;
}

//! 全排列测试
void test1()
{
    vector
<int> vec;
    vec 
+= 1,2,3,4,5,6,7,8;
    sort(vec.begin(),vec.end());
    
int i = 0;
    
do
    {
       print(vec);
       i
++;
    }
    
while(next_permutation(vec.begin(),vec.end()));
    std::cout
<<i<<std::endl;
}

//! 组合测试
size_t test2(int n,int m,boost::function<void(std::vector<int>& vec)> fn)
{
    vector
<int> p,set;
    p.insert(p.end(),m,
1);
    p.insert(p.end(),n
-m,0);
    
for(int i = 0;i != p.size();++i)
        
set.push_back(i+1);
    vector
<int> vec;
    size_t cnt 
= 0;
    
do{
        
for(int i = 0;i != p.size();++i)
            
if(p[i])
               vec.push_back(
set[i]);
        fn(vec);
        cnt 
++;
        vec.clear();
    }
while(prev_permutation( p.begin(), p.end()));
    
return cnt;
}

int main()
{
    test1();
    std::cout
<<test2(20,3,print)<<std::endl;
    
return 0;
}
....................................................................................................................

posted @ 2010-12-29 11:21 ccsdu2009 阅读(7414) | 评论 (5)编辑 收藏
仅列出标题
共38页: First 21 22 23 24 25 26 27 28 29 Last