Tag Archives: qt

改进的图像校验码生成算法和辅助工具

*******************************************
目的
*******************************************
生成图像校验码

*******************************************    
内容           
                               

*******************************************
包括改进的asp图像检验码生成程序,和一个生成body.fix和head.fix的
辅助工具。该辅助工具基于Qt 4开发,基于GNU/GPL协议(请阅读GPL.txt
文档)。附源码。

*******************************************    
USAGE                                        

*******************************************
1. 制作0.bmp, 1.bmp等10张数字图片,并以0.bmp, 1.bmp这样的规律命名
2. 将图片放在images目录下
3. 运行tool.exe
4. 选定“生成Body.fix”,单击“运行”
5. 选定“生成head.fix”,指定检验码位数,宽度和高度是由上一步骤自动
读取得到,如果正确,保持不变。单击“运行”
6. 这时得到body.fix和head.fix,退出。
7. 用文本编辑器打开 valCode_new.asp,修改digit_width、digit_height、
digit_num 这三个参数,使之与以上步骤使用的参数一致
8. 将test.html, valCode_new.asp, body.fix, head.fix,以及blank.bin
五个文件复制到IIS虚拟目录下
9. 在浏览器里浏览test.html,就可以得到预想效果

NOTE: images目录下已经放了示例数字图片。注意每个图片大小必须严格一
致。将valCode_new.asp整合到某一web程序时,可以使用
Session("ValidationCode")对request值进行检验。

*******************************************
FILE LIST
*******************************************

blank.bin
body.fix      
head.fix      
images         <dir>
msvcp71.dll   
msvcr71.dll   
numCode.asp   
QtCore4.dll   
QtGui4.dll    
README        
src            <dir>
test.html     
tool.exe      
tool_zh.qm    
valCode_new.asp

images
0.bmp
1.bmp
2.bmp
3.bmp
4.bmp
5.bmp
6.bmp
7.bmp
8.bmp
9.bmp

src
GPL.txt
main.cpp
tool.cpp
tool.h 
tool.ico
tool.pri
tool.pro
tool.ui          

*******************************************    
CREDIT                                       

*******************************************
valCode_new.asp在BlueIdea.COM Web Team V37 2003-7-25工作的基础
改善完成(所附的numCode.asp是原文件)。
Qt是Trolltech的trademark。

在qt里实现access数据库的compact和repair

增加2个#import,
#import "C:Program FilesCommon FilesSystemadomsado27.tlb" no_namespace rename("EOF","adoEOF")
#import "C:Program FilesCommon FilesSystemadomsjro.dll"
增加从QString到BSTR的转换函数
static inline BSTR QStringToBSTR(const QString &str)
{
 return SysAllocStringLen((OLECHAR*)str.unicode(), str.length());
以下主要代码,注意在srcConnection和desConnection不能指向同一个数据源。
//compact the db
 JRO::IJetEnginePtr jet(__uuidof(JRO::JetEngine));
 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 QString srcConnection=QString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%1;")
  .arg(dbqPath);
 QString desConnection=QString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%1;")
  .arg(dbqPath+".tmp");
 jet->CompactDatabase(QStringToBSTR(srcConnection), QStringToBSTR(desConnection));
 bool renameError=false;
 if ( !QFile::rename(dbqPath, dbqPath+"k")) renameError=true;
  
 if (!QFile::rename(dbqPath+".tmp", dbqPath)) renameError=true;
    QApplication::restoreOverrideCursor();

如何在Qt程序里关闭另一个程序?

好象Qt是没有提供好的方案了。
(1)另一个程序在运行时,在某个地方写一些特殊的东西,Qt程序可以根据这些特殊的
东西进行判断该程序是否正在运行。正如qtcn群上一位同志讲的,如果该程序没有正常
退出的话,Qt程序的判断就会有问题。此外,这种solution的一个前提是Qt程序和该程
序都应该是有源码可以修改的。一个好处是绝对是cross platform的。
(2)应用独立于platform的代码。比如可以用win32 api来枚举进程,但问题是相对比较
复杂,比如在winxp和nt上的枚举相关api都不一样,在linux, mac等平台上的实现更是
不容易。
(3)msdn上给出一种相对简便的方法(http://support.microsoft.com/?kbid=153463),
也是应用win32 api。先使用findWindow,输入窗口的title,得到该程序的handler,
然后向应用postMessage向该程序发送WM_QUIT(eggheadcafe.com上有人建议用
WM_CLOSE
(http://support.microsoft.com/default.aspx?scid=kb;en-us;178893)),来关闭该
程序。缺陷,一个也是独立于平台的,另外一个,应用FindWindow,不排除有窗口
title相同的程序,这样返回的handler未必正确。

qDebug()引起的一连串free溢出

调用类似 qDebug()<"main(), db.dbConnect() ="<<db.dbConnect();
引起程序在关闭的时候,free.c内存溢出。
qDebug doc讲,在一些平台,如果输入const char* =0的时候,可能crash掉
但现在不是这个问题,
最后发现原因是 在连接的时候输入库写成 release版本了,选择对应的debug版本就ok了(QtSql4.lib->QtSqld4.lib)。
此为记!

QODBC/Qt4

调试了很长时间,总是提示说“数据源名称过长”,后来发现问题出在将connStr里的
DRIVER写成Driver了
Qt的ODBC好象对大小写敏感,所以一定要根据DSN里的原样copy过来。

bool UserSoils::connectDb()
{

//create default conn using assigned dbPath
QString connStr=QString(
"DRIVER={Microsoft dBASE Driver (*.dbf)};FIL={dBase 5.0};DBQ=%1")

.arg(dbPath());

//for access
//QString connStr=QString(
// "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=c:xxxx.mdb");
qDebug()<<"UserSoils::connectDb(), connStr ="<< connStr;
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName(connStr);
return db.open();
//qDebug()<<"UserSoils::connectDb(),"<<db.lastError().databaseText();

}

tt给出的重载最小化的方案

并不是很好的方法,在WindowStateChange后,实际上minimizing已经完成,
而最好的地点应该是clicking后,但未实际招执行minimizing的位置上。
重载winEvent是个不错的方法
bool event(QEvent *event)
{
if(event->type() == QEvent::WindowStateChange)
{
if (event->spontaneous() && isMinimized()) {
hide();
setWindowFlags(Qt::FramelessWindowHint);

//if you want to show the window again you need the following
//setWindowFlags(Qt::Window);
//show();

return true;
}
else
QWidget::event(event);
}
else
QWidget::event(event);

}

QMenu popup strange behavior

thanks to bubu @ qtforum.org

If you need to use all available screen, then you must look up in qmenu.cpp source file in 1273 line where is:
QRect screen = QApplication::desktop()->availableGeometry(p);
Change it to:
QRect screen = QApplication::desktop()->screenGeometry(p);
then it works like you need

Yes, it does!