zhonghua

C++博客 首页 新随笔 联系 聚合 管理
  72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

#

设置正则表达式.
类似下面的
QRegExp
这里的用法就是用来检测QString等字符串错误的,例如文件名里面最好就不出现<>|/\:等,所以可以如下定义QRegExp rx("[a-zA-Z0-9\-\\\_]{25}"); 25就是所输入的字符串个数!a-z当然就是a-z,你也可以abcdefghijklm....等等.\- 就是-

好了,现在可以把这个rx绑入QRegExpValidator.

QRegExpValidator *pRevalidotor = new QRegExpValidator(regExp, this);

绑入lineEdit :

pEditWell->setValidator(new QRegExpValidator(regExp, this));

常用的:
"^\d+$"  //非负整数(正整数 + 0) <br>

"^[0-9]*[1-9][0-9]*$"  //正整数 <br>

"^((-\d+)|(0+))$"  //非正整数(负整数 + 0) <br>

"^-[0-9]*[1-9][0-9]*$"  //负整数 <br>

"^-?\d+$"    //整数 <br>

"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0) <br>

"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 <br>

"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0) <br>

"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 <br>

"^(-?\d+)(\.\d+)?$"  //浮点数 <br>

"^[A-Za-z]+$"  //由26个英文字母组成的字符串 <br>

"^[A-Z]+$"  //由26个英文字母的大写组成的字符串 <br>

"^[a-z]+$"  //由26个英文字母的小写组成的字符串 <br>

"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 <br>

"^\w+$"  //由数字、26个英文字母或者下划线组成的字符串 <br>

"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 <br>

"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url <br>

"^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$" // 年-月-日 <br>

"^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" // 月/日/年 <br>

"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"    //Email <br>

"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"      //电话号码 <br>

"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"  

//IP地址</font></p>

<p><font size="3" color="#ff9900">^([0-9A-F]{2})(-[0-9A-F]{2}){5}$    //MAC地址的正则表达式 <br>

^[-+]?\d+(\.\d+)?$ //值类型正则表达式</font></p>

</font><br>

<br>

<font size="3">QRegExp是Qt的正则表达式类.<br>

Qt中有两个不同类的正则表达式.<br>

第一类为元字符.它表示一个或多个常量表达式.<br>

令一类为 转义字符,它代表一个特殊字符.<br>

<br>

一.元字符<br>

. 匹配任意单个字符.例如, 1.3 可能是1. 后面跟任意字符,再跟3<br>

^ 匹配字符串首. 例如, ^12可能是123,但不能是312<br>

$ 配字符串尾. 例如, 12$可以是312, 当不能是 123<br>

[] 匹配括号内输入的任意字符.[123]可以为1, 2 或3<br>

* 匹配任意数量的前导字符. 例如, 1*2可以为任意数量个1(甚至没有), 后面跟一个2<br>

+ 匹配至少一个前导字符. 例如, 1+2必须为一个或多个1, 后跟一个2<br>

? 匹配一个前导字符或为空. 例如 1?2可以为2或这12<br>

<br>

二.统配模式<br>

通过 QRegExp::setPatternSyntax(QRegExp::Wildcard);可以将元字符设置为统配模式.在统配模式下,只有3个元字 符可以使用.他们的功能没有变化.<br>

? 匹配任意单个字符, 例如, 1?2可以为1,后面跟任意单个字符, 再跟2<br>

* 匹配任意一个字符序列. 例如, 1*2, 可以为1, 后面跟任意数量的字符, 再跟一个2<br>

[] 匹配一个定义的字符集合. 例如, [a-zA-Z\.]可以匹配 a到z之间任意一个字符和. [^a]匹配出小写a以外的字符.<br>

<br>

三.转义序列<br>

\. 匹配"."<br>

\^ 匹配"^"<br>

\$ 匹配"$"<br>

\[ 匹配"["<br>

\] 匹配"]"<br>

\* 匹配"*"<br>

\+ 匹配"+"<br>

\? 匹配"?"<br>

\b 匹配响铃字符,使计算机发出嘟的一声.<br>

\t 制表符号<br>

\n 换行符号<br>

\r 回车符铪<br>

\s 任意空格<br>

\xnn 匹配16进制为nn的字符<br>

\0nn 匹配8进制的nn字符<br>

这些表达式均以\开始, 与C++的转义字符相同,所以为了定义QRegExp中的一个转义序列,<br>

需要在前面添加两个\\
posted @ 2012-06-21 10:55 米米 阅读(333) | 评论 (0)编辑 收藏

1.
 QTimer *timer = new QTimer( myObject );
 connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );
 timer->start( 2000, TRUE ); // 2秒单触发定时器
QTimer *t = new QTimer( myObject );
connect( t, SIGNAL(timeout()), SLOT(processOneThing()) );
 t->start( 2000, FALSE ); // 2秒单触发定时器

2.void QTimer::singleShot ( int msec, QObject * receiver, const char * member ) [静态]
QTimer::singleShot( 10*60*1000, &a, SLOT(quit()) );

posted @ 2012-06-20 10:27 米米 阅读(493) | 评论 (0)编辑 收藏

QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数:

Qt::ContextMenuPolicy contextMenuPolicy () const

void setContextMenuPolicy ( Qt::ContextMenuPolicy policy )

Qt::ContextMenuPolicy枚举类型包括:Qt::DefaultContextMenu, Qt::NoContextMenu, Qt::PreventContextMenu, Qt::ActionsContextMenu, and Qt::CustomContextMenu。

使用方式如下:


1)默认是Qt::DefaultContextMenu。
它 是利用右键菜单事件contextMenuEvent()来处理(which means the contextMenuEvent() handler is called)。就是要重写contextMenuEvent( QContextMenuEvent * event )函数。


2)使用Qt::CustomContextMenu。
它是发出QWidget::customContextMenuRequested信号,注意仅仅只是发信号,意味着要自己写显示右键菜单的slot。
这个信号是QWidget唯一与右键菜单有关的信号(也是自有的唯一信号),同时也是很容易被忽略的signal:

void customContextMenuRequested ( const QPoint & pos )

该信号的发出条件是:用户请求contextMenu(常规就是鼠标右击啦)且同时被击的widget其contextMenuPolicy又是Qt::CustomContextMenu。
注 意:pos是该widget接收右键菜单事件的位置,一般是在该部件的坐标系中。但是对于QAbstratScrollArea及其子类例外,是对应着其 视口viewport()的坐标系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子类。
因为仅发信号,所以需自己写显示右键菜单的slot来响应,例如一个表格(QTableView类型)表头的显示右键菜单槽:
datatable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);
connect(datatable->horizontalHeader(), SIGNAL(customContextMenuRequested(const QPoint&)),
        this, SLOT(show_contextmenu(const QPoint&)));//this是datatable所在窗口
QMenu *cmenu = NULL;
show_contextmenu(const QPoint& pos)
{
    if(cmenu)//保证同时只存在一个menu,及时释放内存
    {
        delete cmenu;
        cmenu = NULL;
    }
    QMenu cmenu = new QMenu(datatable->horizontalHeader());
   
    QAction *ascendSortAction = cmenu->addAction("升序");
    QAction *descendSortAction = cmenu->addAction("降序");
    QAction *filterAction = cmenu->addAction("过滤");
    QAction *reshowAction = cmenu->addAction("重载");
   
    connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
    connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
    connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
    connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
   
    cmenu->exec(QCursor::pos());//在当前鼠标位置显示
    //cmenu->exec(pos)是在viewport显示
}

也可先做好cmenu,好处是始终使用一个:
    QMenu cmenu = new QMenu(datatable->horizontalHeader());
   
    QAction *ascendSortAction = cmenu->addAction("升序");
    QAction *descendSortAction = cmenu->addAction("降序");
    QAction *filterAction = cmenu->addAction("过滤");
    QAction *reshowAction = cmenu->addAction("重载");
   
    connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
    connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
    connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
    connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
show_contextmenu(const QPoint& pos)
{
    if(cmenu)
    {
        cmenu->exec(QCursor::pos());
    }
}


3)使用Qt::ActionsContextMenu。
把部件的所有action即QWidget::actions()作为context menu显示出来。
还是上面的例子,要在表格(QTableView类型)表头显示右键菜单:
        QAction *ascendSortAction = new QAction("升序", this);
        QAction *descendSortAction = new QAction("降序", this);
        QAction *filterAction = new QAction("过滤", this);
        QAction *unfilterAction = new QAction("取消过滤", this);
   
        connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
        connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
        connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(filter_table()));
        connect(unfilterAction, SIGNAL(triggered(bool)), this, SLOT(unfilter_table()));
   
        datatable->horizontalHeader()->addAction(ascendSortAction);
        datatable->horizontalHeader()->addAction(descendSortAction);
        datatable->horizontalHeader()->addAction(filterAction);
        datatable->horizontalHeader()->addAction(unfilterAction);
        
        datatable->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);

另外两个就是不显示context menu了:
Qt::NoContextMenu
    the widget does not feature a context menu, context menu handling is deferred to the widget's parent.
   
Qt::PreventContextMenu
    the widget does not feature a context menu, and in contrast to NoContextMenu, the handling is not deferred to the widget's parent. This means that all right mouse button events are guaranteed to be delivered to the widget itself through mousePressEvent(), and mouseReleaseEvent().

补充:
    使用Qt::ActionsContextMenu比较简洁,但是如果需要根据当前菜单弹出的位置来定义不同菜单,或者像上个例子,在表格 (QTableView类型)表头显示右键菜单时,我需要知道是哪一列表头被点击,从而在后来调用sort_ascend()排序函数时能够根据不同列进 行不同排序策略,那么Qt::ActionsContextMenu就做不到了。
    这种需要捕捉弹出位置的情况只好用Qt::ActionsContextMenu了,customContextMenuRequested ( const QPoint & pos )信号返回点击位置pos(在表头视口坐标系中位置),然后表头即可调用logicalIndexAt(pos)函数得到被点击section对应的 index即被点击部分的列号,然后存下来可供后面action激活的排序槽使用。
show_contextmenu(const QPoint& pos)
{
    //get related column of headerview
    contextmenu_column = datatable->horizontalHeader()->logicalIndexAt(pos);

    //show contextmenu
    if(cmenu)
    {
        cmenu->exec(QCursor::pos());
    }
}

posted @ 2012-06-01 16:25 米米 阅读(875) | 评论 (0)编辑 收藏

qmake 常用命令:
qmake -project //生成pro文件,自动检查c/c++程序文件
   qmake -tp vc //根据pro文件生成vc的工程文件,qt commericial有一个绑定到vs的工具,可以在菜单栏直接打开
   qmake -r xxx.pro "CONFIG+=debug" //递归生成makefile
   moc //包含Q_OBJECT文件转换器
   rcc //Qt resource compiler
   uic //Qt ui file translator,to .h file.
 
Qt 常用宏:
   平台相关
   Q_WS_WIN //window系统
   Q_WS_X11 //xwindow系统
   Q_WS_MAC //苹果mac系统
   Q_WS_SOL //sun的solaris系统
   其它
   QT_OPENGL_SUPPORT //是否支援opengl
   QT_VERSION    //qt的版本,如 if QT_VERSION > 0x040601(qt > 4.6.1)
   QT_VERSION_STR //qt版本的字符串
   QT_POINTER_SIZE //指针的字节宽度 32bit=4,64bit=8
   QT_REQUIRE_VERSION //用在代码中,比如QT_REQUIRE_VERSION(argc, argv, "4.0.2");
global常用函数
         T qAbs(const T & value) //返回绝对值
   void qCritical(const char * msg, ...) //输出告警信息  参赛类似printf
   void qDebug(const char * msg, ... ) // 输出调试信息
   void qFatal(const char * msg, ... ) //输出错误信息
   qMax(const T & value1,const T & value2 )// 求最大
   qMin(const T & value1,const T & value2 ) // 求最小
pro 文件格式
#: 表示到行尾均为注视,被忽略
  include: 可以包含别的文本文件,一般为*pri 例如 #include "../global.pri"
  scope{;;}: 预定义 ,如win32{} 表示在win32平台下的定义,其它忽略
  win32/unix/linux-g++/linux-g++-64: 平台宏
  DESTDIR: 产生目标文件路径
  MOC_DIR: moc转换文件路径
  RCC_DIR: 资源文件路径
  UI_DIR:ui文件转换的路径
  LIBEXT: 产生lib的后缀
  QMAKE_CFLAGS_DEBUG:
  QMAKE_CXXFLAGS_DEBUG:
  QMAKE_CFLAGS_RELEASE:
  QMAKE_CXXFLAGS_RELEASE:
  TEMPLATE: 决定生成makefile采用的模板,
   =lib 表示库文件
   =app 表示生成可执行文件
   =subdirs 表示处理子目录(在下面用SUBDIRS += **来指定那些子目录)
  TARGET: 指定目标文件名
  Qt+=: 添加额外的模块支持,例如Qt -= QtCore;Qt += network,phonon,xml,thread
  DEFINES: 添加额外的宏定义,如win下需要的export等
  DEPENDPATH: 添加以来的路径
  INCLUDEPATH: 添加头文件包含路径
  HEADERS: 需要包含的头文件
  SOURCES: 需要包含的源文件
  FORMS: 需要包含的ui文件
  RESOURCES:需要包含的资源文件
  LIBS:依赖库的路径和名称 -L{xxdirxx} -l{xxnamexx}
  CONFIG: 添加配置,如warn_on debug_and_release plugin
  TRANSLATIONS: 多国语言支持文件
  INSTALLS: 要安装的文件
  target.path: 安装的路径
  #在pro文件支持environment variables和自定义变量
  #如sources.file += $$SOURCES $$HEADERS
  #sources.path = $$DESTIN_DIR
  #INSTALLS += target source
  defineReplace(xxx): xxx为变量 ,此函数可以返回一个变量值如:$$xxx()
exists(file1,file2){error()}:检查文件是否存在
 
posted @ 2012-05-30 09:49 米米 阅读(681) | 评论 (0)编辑 收藏

     摘要: 1、QGridLayout QGridLayout包含多个grid,它并没有要求其中的每个grid的size相同,通常情况下,每个grid的size是不同的。 对于成员函数addWidget(widget, fromRow, fromColumn, rowSpan, columnSpan, alignment):rowSpan表示新添加进来的widget在垂直方向上跨越或者占据多少个grid。 c...  阅读全文
posted @ 2012-05-28 14:47 米米 阅读(3619) | 评论 (0)编辑 收藏

这篇文章是在Blogspot上看到的一篇文章,能够解决QString, wchar_t *, TCHAR和其他字符或字符串类型之间的转换,方便在使用Windows API的时候转换的麻烦。

原文地址:http://tkrotoff.blogspot.com/2010/04/code-snippets-about-qstring-wchart.html

//QString to wchar_t *: const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(fileName.utf16());  //QString to char * given a file name: QByteArray fileName = QFile::encodeName(aFileName); const char * encodedName = fileName.constData(); //Valid as long as fileName exists  //QString to char * (general case): const char * tmp = str.toUtf8().constData(); [/code] Windows 数据类型: http://msdn.microsoft.com/en-us/library/aa383751.aspx [code lang="cpp"] //TCHAR: #ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif  //LPCTSTR: #ifdef UNICODE typedef LPCWSTR LPCTSTR; #else typedef LPCSTR LPCTSTR; #endif  //LPCSTR: typedef const char * LPCSTR;  //LPCWSTR: typedef const wchar_t * LPCWSTR;  //LPCWSTR to QString: QString text(QString::fromUtf16(reinterpret_cast<const unsigned short *>(tmp)));

另一种解决办法是使用QString::fromWCharArray(),但这个函数可能导致一些尚未解决的wchar_t符号问题。

最佳的编程风格: 使用L来定义wchar_t宽字符串,比如 L"text" 字义了一个UNICODE字符串"text"。

今天又看到一个文章,关于字符串之间的转换,比较全面,在此将英文翻译并整理一下。
原文地址:http://hi.baidu.com/koko200147/blog/item/7e3cad828c9b9bb66d8119cb.html

QString与其他字符类型之间的转换,QString在Qt4中是UNICODE编码的,使用utf16规范。

QString::fromAscii ( const char * str, int size = -1 ); QString::fromLatin1 ( const char * str, int size = -1 ); QString::fromLocal8Bit ( const char * str, int size = -1 ); QString::fromRawData ( const QChar * unicode, int size ); QString::fromStdString ( const std::string & str ); QString::fromStdWString ( const std::wstring & str ); QString::fromUcs4 ( const uint * unicode, int size = -1 ); QString::fromUtf8 ( const char * str, int size = -1 ); QString::fromUtf16 ( const ushort * unicode, int size = -1 ); QString::fromWCharArray ( const wchar_t * string, int size = -1 );  //qstring ->std::string QString::toStdString () ; QString::toStdWString ();  //BSTR<->QString,不太了解BSTR是什么,还没用到过,所以不知道对不对 BSTR bstr_str; QString q_str((QChar*)bstr_str, wcslen(bstr_str)); bstr_str = SysAllocString(q_str.utf16());//remember use SysFreeString on BSTR  //QString<->LPCSTR QString::toLocal8Bit().constData(); QString::fromLocal8Bit ( const char * str, int size = -1 );  //QString<->LPCWSTR QString::utf16(); QString::fromUtf16 ( const ushort * unicode, int size = -1 );  //QString<->CString CString c_str(qstring::utf16()); QString fromUtf16 (LPCTSTR(c_str) );

CString转换为char*

//1.传给未分配内存的const char* (LPCTSTR)指针. CString cstr(asdd); const char* ch = (LPCTSTR)cstr;//ch指向的地址和cstr相同。但由于使用const保证ch不会修改,所以安全.  //2.传给未分配内存的指针. CString cstr = "ASDDSD"; char *ch = cstr.GetBuffer(cstr1.GetLength() + 1); cstr.ReleaseBuffer(); //修改ch指向的值等于修改cstr里面的值. //PS:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.  //3.第二种用法。把CString 值赋给已分配内存的char *。 CString cstr1 = "ASDDSD"; int strLength = cstr1.GetLength() + 1; char *pValue = new char[strLength]; strncpy(pValue, cstr1, strLength);  //4.第三种用法.把CString 值赋给已分配内存char[]数组. CString cstr2 = "ASDDSD"; int strLength1 = cstr1.GetLength() + 1; char chArray[100]; memset(chArray,0, sizeof(bool) * 100); //将数组的垃圾内容清空. strncpy(chArray, cstr1, strLength1);  //5.如果上述都不行,使用以下方法 CString origCString("Hello, World!"); wchar_t* wCharString = origCString.GetBuffer(origCString.GetLength()+1); size_t origsize = wcslen(wCharString) + 1; size_t convertedChars = 0; char *CharString; CharString=new char(origsize); wcstombs_s(&convertedChars, CharString, origsize, wCharString , _TRUNCATE); cout << CharString << endl; //成功输出字符串"Hello,World"

从UTF8编码到GB编码的字符串转换方法:

QString Utf8_To_GB(QString strText) { return QString::fromUtf8(strText.toLocal8Bit().data()); }

从GB编码到UTF8编码的字符串转换方法:

QString GB_To_Utf8(char *strText) { return QString::fromLocal8Bit(strText); }
posted @ 2012-05-21 13:51 米米 阅读(1700) | 评论 (0)编辑 收藏

比如有个事务处理比较耗时间,你可以在中间不时地processEvents()下,这样好让界面处理一下各种事件,避免看上去无反应像死掉一样。
qApp->processEvents();
posted @ 2012-05-02 09:56 米米 阅读(312) | 评论 (0)编辑 收藏

在程序main.cpp中加入以下代码


#include <QTextCodec>

int main(int argc, char **argv)
{
    QTextCodec *codec = QTextCodec::codecForName("GB2312");
    QTextCodec::setCodecForLocale(codec);

    QTextCodec::setCodecForCStrings(codec);

    QTextCodec::setCodecForTr(codec);
}
这样在程序其他地方就可以使用中文了, tr(“中文”) 或者直接使用“中文了;


解决读取ini文件中中文乱码

QSettings settings("xxxx.ini",QSettings::IniFormat);

settings.setIniCodec(QTextCodec::codecForName("GB2312"));   //在此添加设置,即可读写ini文件中的中文

settings.beginGroup("company");

解决读取中文文件中文的乱码
QFile file("xxxx.txt");
QTextStream stream(file,QIODevice::ReadOnly);
stream.setCodeC( QTextCodec::codecForName("GB2312") );
stream.readAll();

posted @ 2012-04-28 13:44 米米 阅读(353) | 评论 (0)编辑 收藏

虽然C++标准中有了文件读取的相关类,也很好用,但是在涉及到QT编程的时候却用起来不方便了,因为QT本身很多组件都是关联的自身的 QString类型的字符串,所以再用C++本身String类型的时候就不是那么方便了,需要进行转化,这样给程序带来了复杂度,同时也带来了转化的开销,所以如果用QT开发,可以就用它本身所带的这些类型进行处理,形成一个系统,便于数据在程序之中的交互和共用。
   QT很好,但是在处理中文或者其他语言的时候要注意编码格式,如果没有注意,读取文件的时候可能读出来的就是乱码或者干脆程序就死掉了,这是我们所不愿意看到的,下面就讲讲怎么样通过QT的类来读取中文文件。

介绍部分
   我们需要用到几个头文件中的类:
#include <qstring.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qtextcodec.h>


QString

QString类提供了一个Unicode文本和经典的C以零结尾的字符数组的抽象。
QString使用隐含共享,这使它非常有效率并且很容易使用。
所有的QString的方法都使用const char *参数,const char *被解释为经典的C风格的以零结尾的ASCII字符串。所以const char *参数为0是合法的。如果const char *不是以零结尾的,结果是不确定的。把经典的C字符串复制到QString的函数将不会复制结尾的0字符。QString的QChar数组(可以通过 unicode()返回)通常不以零结尾。如果你需要把QString传递到一个需要C的以零结尾的字符串,请使用latin1()。
没有分配任何东西的QString是零,也就是长度和数据指针都为0。引用空字符串(“”,一个单一的'\0'字符)的QString是空。零和空这两个 QString在方法中都是合法的。把(const char *) 0赋值给QString给定了一个零QString。为了方便,QString::null是一个零QString。当排序的时候,空字符串在最前面,然后是非空字符串,然后才是零字符串。我们建议使用if ( !str.isNull() ),而不是if ( !str )来检测非零字符串,关于解释说明也可以参考operator!()。
注意如果你发现你正在混合使用QCString、QString和 QByteArray,这将会导致很多不必要的复制并且也许会预示着你正在处理的真实自然数据是不确定的。如果数据是以零结尾的八位数据,请使用 QCString;如果它是没有结尾的(也就是包含0)八位数据,请使用QByteArray;如果它是文本,请使用QString。
字符串列表可以使用QStringList类来处理。你可以使用QStringList::split()来把一个字符串分割为一个字符串列表,并且可以使用 QStringList::join()把一个字符串列表连接成一个使用随意间隔符的字符串。你也可以使用QStringList::grep()从一个字符串列表中获得包含特定子字符串或者包含匹配特定的regex的字符串列表。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QFile

QFile类是一个操作文件的输入/输出设备。
QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QDataStream或QTextStream一起使用将更加方便。
文件名通常可以通过构造函数来传递,但也可以使用setName()来设置。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。
文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进行读写,但你也可以使用readBlock()和readLine()来读,使用writeBlock()来写。QFile也支持getch()、 ungetch()和putch()。
size()可以返回文件的大小。你可以通过使用at()函数得到当前文件位置或者移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。handle()返回文件句柄。
这里是一个使用QTextStream来一行一行地读取一个文本文件的代码段。它会把每一行带上一个行号打印出来。

    QStringList lines;
    QFile file( "file.txt" );
    if ( file.open( IO_ReadOnly ) ) {
        QTextStream stream( &file );
        QString line;
        int n = 1;
        while ( !stream.eof() ) {
            line = stream.readLine(); // 不包括“\n”的一行文本
            printf( "%3d: %s\n", n++, line.latin1() );
            lines += line;
        }
        file.close();
    }
 
写文本也很容易(假设我们有一个行的字符串列表要写):

    QFile file( "file.txt" );
    if ( file.open( IO_WriteOnly ) ) {
        QTextStream stream( &file );
        for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )
            stream << *it << "\n";
        file.close();
    }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QTextStream

QTextStream类提供了使用QIODevice读写文本的基本功能。
文本流类的功能界面和标准的C++的iostream类非常相似。iostream和QTextStream的不同点是我们的流操作在一个很容易被继承的QIODevice上,而iostream只能操作一个不能被继承的FILE *指针。
Qt提供了几个和iostream相似的全局函数:
bin设置QTextStream来读/写二进制数字
oct设置QTextStream来读/写八进制数字
dec设置QTextStream来读/写十进制数字
hex设置QTextStream来读/写十六进制数字
endl强制换行
flush强制QIODevice刷新任何被缓存的数据
ws作为任何可用的控制符(在输入的时候)
reset重新设置QTextStream为它的缺省模式(请见reset())
qSetW(int)设置字段宽度作为指定参数
qSetFill(int)设置填充字符作为指定参数
qSetPrecision(int)设置精确度作为指定参数
警告:默认情况下,QTextStream在读取流的时候,会自动地检测流中的数字是十进制、八进制、十六进制或者二进制格式。具体情况是,一个以“0”为开头的数字是八进制的,比如顺序为“0100”将会被解释为64。
QTextStream类读写文本,它不适合处理二进制数据(而QDataStream是适合的)。
默认情况下,输出的是使用本地8位编码后的Unicode文本(比如,QString)。这些可以使用setEncoding()方法进行改变。对于输入,QTextStream会自动检测标准Unicode“字节顺序标记的”文本文件,否则会使用本地8位编码。
QIODevice 在构造函数中被设置,或者之后在setDevice()中使用。如果输入到达了atEnd(),返回真。数据可以使用operator>> ()重载操作符读到适当类型的变量中,或者使用read()把它作为整个部分读到一个单一的字符串中,或者使用readLine()把一次读一行。使用 skipWhiteSpace()可以忽略控制符。你可以使用flags()或setf()来设置流的标记。这个流也支持width()、 precision()和 fill(),使用reset()可以重新恢复默认设置。
也可以参考QDataStream、输入/输出和网络和文本相关类.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QTextCodec

QTextCodec 类提供文本编码之间的转换。
QT使用Unicode来存储,绘制以及操作字符串。在很多情况下,你可能想要使用不同的编码方式来处理数据。例如大部分的日语文件都被存储在Shift-JIS或者 ISO2022的文件中,而俄罗斯的用户常常使用KOI8-R或者CP1251编码方式。QT提供了一个QTextCodec 类集合来从Unicode格式转化到相应的格式。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码部分

#include <qstring.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qtextcodec.h>

int main()

 QFile file("test.txt");
 if (file.open(IO_ReadOnly|IO_Raw))
 {
  QTextStream floStream(&file);
  QString line;
  QTextCodec *codec=QTextCodec::codecForName("GBK");
  floStream.setCodec(codec);
  while ( floStream.atEnd()==0 )
  {
   line = codec->fromUnicode(floStream.readLine());
   qWarning(line);
  }
  file.close();   
 }
 return 0;
}
代码中的主要改动就是黄底的部分
意思就是创立一个中文GBK编码样式,然后按照这种方式来把读入的文件流进行重新编码,这样中文就可以顺利输出了,不信你可以试一试,哈哈,先介绍这么多,下次有什么下次再写啦。

posted @ 2012-04-26 09:44 米米 阅读(497) | 评论 (0)编辑 收藏

    QDataWidgetMapper将一个数据库记录字段反映到其映射的窗口部件中,同时将窗口部件中所做出的更改反映回数据库,关键是关联一个model和一组widget
一、步骤

1、创建 QDataWidgetMapper 对象
2、关联 model
3、关联 widgets,并创建其与model中section的映射
4、定位到某个record

  1. QDataWidgetMapper *mapper = new QDataWidgetMapper;  
  2. mapper->setModel(model);  
  3. mapper->addMapping(mySpinBox, 0);  
  4. mapper->addMapping(myLineEdit, 1);  
  5. mapper->toFirst();  


提交方式可以设为手动:

  1. mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);  


 QComboBox组件的mapper比较特殊

第一种、在关系模型中实现mapper到QComboBox组件

  1. QSqlRelationalTableModel *model = QSqlRelationalTableModel(this);  
  2.   
  3. model->setTable("员工表");  
  4. model->setRelation(dep_id,QSqlRelation("部门表","id","name"));  
  5.  // ... 其它代码  
  6.   
  7. //QComboBox与QListWidget很相拟,因为它有一个内部模型去保存它的数据条目,所以我们用自己建的模型代替那个自带的模型。给出QSqlRelationalTableModel使用的关系模型,这个模型有两列,必须指出组合框应该显示哪一列  
  8. QSqlTableModel *relationModel = model->relationModel(dep_id); // 部门ID  
  9. comboBox->setMode(relationModel);  
  10. comboBox->setModelColumn(relationModel->fieldIndex("name")); // 使用字段名得到正确的标题索引,以使组合框显示部门名  

 

第二种、使用代理的方式

1、实现自定义代理类,实现setEditorData()和setModelData()

2、给模型添加我们自己的代理类对象

  1. MapDelegate *delegate = new MapDelegate(this); // 生成自定义的代理类对象  
  2. mapper->setItemDelegate(delegate); // 给模型添加我们自己的代理类  
  1. void MapDelegate::setEditorData(QWidget *editor, const QModelIndex& index) const{  
  2.     if(index.column() == 0) // 假如模型的第0列为公司名   
  3.     {  
  4.         QComboBox *comboEditor = qobject_cast<QComboBox *>(editor);  
  5.         if (comboEditor)  
  6.         {  
  7.             int i = comboEditor->findText(index.model()->data(index, Qt::EditRole).toString()); // 在comboBox组件中查找model中的当前公司名  
  8.        comboEditor->setCurrentIndex(i); // 设成model中的当前公司名  
  9.         }         
  10.     }  
  11.     else  
  12.     {  
  13.         return QItemDelegate::setEditorData(editor, index);  
  14.     }  
  15. }  
  16.   
  17. void MapDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const  
  18. {  
  19.     if(index.column() == 0)  
  20.     {  
  21.         QComboBox *comboBox = qobject_cast<QComboBox *>(editor);  
  22.         if(comboBox)  
  23.         {  
  24.             model->setData(index, comboBox->currentText());  
  25.         }  
  26.     }  
  27.     else  
  28.     {  
  29.         return QItemDelegate::setModelData(editor, model, index);  
  30.     }  
  31. }  
posted @ 2012-04-24 15:28 米米 阅读(401) | 评论 (0)编辑 收藏

仅列出标题
共8页: 1 2 3 4 5 6 7 8