博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用c++写的一个词典工具
阅读量:6244 次
发布时间:2019-06-22

本文共 4431 字,大约阅读时间需要 14 分钟。

使用的QT图形界面,用libcurl获取的网页,在之中遇见了很多问题,一直想用c++类封装一下libcurl,发现c++很不到家啊。索性用了友元函数。

先贴上代码吧

main.cpp 

ExpandedBlockStart.gif
View Code
#include 
<
stdio.h
>
#include 
<
stdlib.h
>
#include 
<
unistd.h
>
#include 
<
curl
/
curl.h
>
#include 
<
curl
/
types.h
>
#include 
<
curl
/
easy.h
>
#include 
<
QtGui
/
QApplication
>
#define
 mydebug 0
using
 
namespace
 std;
#include 
"
Dict.h
"
FILE 
*
fp; 
//
定义FILE类型指针
size_t write_data(
void
 
*
ptr, size_t size, size_t nmemb, 
void
 
*
stream)
{
    
int
 written 
=
 fwrite(ptr, size, nmemb, (FILE 
*
)fp);
    
return
 written;
}
int
 getpage(QString aUrl)
{
        CURL 
*
curl;
        QString mUrl
=
""
;
        mUrl.append(
"
http://dict.baidu.com/s?wd=
"
);
        mUrl.append(aUrl);
        mUrl.append(
"
&tn=dict
"
);
        curl_global_init(CURL_GLOBAL_ALL);
        curl
=
curl_easy_init();
        QByteArray ba 
=
 mUrl.toLatin1();
        
const
 
char
 
*
c_str2 
=
 ba.data();
        curl_easy_setopt(curl,CURLOPT_URL,c_str2);
        
if
((fp
=
fopen(
"
/home/archy/newfile
"
,
"
w
"
))
==
NULL)
        {
                curl_easy_cleanup(curl);
                exit(
1
);
        }
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        
return
 
0
;
}
int
 main(
int
 argc, 
char
 
*
argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    
return
 a.exec();
}

Dict.h

#ifndef DICT_H
#define
 DICT_H
#include 
<
QtGui
>
#include 
"
translate.h
"
#include 
"
one.h
"
class
 QPushButton;
class
 QLineEdit;
class
 QTextEdit;
class
 Dialog : 
public
 QDialog
{
    Q_OBJECT
public
:
    Dialog(QWidget 
*
parent 
=
 
0
);
    
~
Dialog();
    friend 
int
 getpage(QString aUrl);
    QString getResult();
private
 slots:
    
void
 clearItem();
    
void
 searchItem();
    
void
 UpdateClearBtn();
    
void
 UpdateSearchBtn();
private
:
    QPushButton 
*
mClearBtn;
    QPushButton 
*
mSearchBtn;
    QLineEdit 
*
mItem;
    QTextEdit 
*
mResult;
    one 
*
aone;
};
#endif
 
//
 DICT_H

 Dict.cpp

ExpandedBlockStart.gif
View Code
  1 
#include 
<
QtGui
/
QHBoxLayout
>
  2 
#include 
<
QtGui
/
QVBoxLayout
>
  3 
#include 
"
Dict.h
"
  4 
#include 
<
QMessageBox
>
  5 
  6 
extern
 
int
 getpage(QString aUrl);
  7 
  8 
  9 
 10 
Dialog::Dialog(QWidget 
*
parent)
 11 
    : QDialog(parent)
 12 
{
 13 
    
//
init class of translate
 14 
    
//
aone = new one();
 15 
    
//
init controls
 16 
    mClearBtn 
=
 
new
 QPushButton(
"
Clear
"
);
 17 
    mSearchBtn 
=
 
new
 QPushButton(
"
Search
"
);
 18 
 19 
    mClearBtn
->
setFlat(
1
);
 20 
    mClearBtn
->
setFixedSize(
50
,
30
);
 21 
    mSearchBtn
->
setFlat(
1
);
 22 
    mSearchBtn
->
setFixedSize(
50
,
30
);
 23 
 24 
    mItem 
=
 
new
 QLineEdit;
 25 
    mResult 
=
 
new
 QTextEdit;
 26 
 27 
 28 
 29 
    connect(mClearBtn,SIGNAL(clicked()),
this
,SLOT(clearItem()));
 30 
    connect(mSearchBtn,SIGNAL(clicked()),
this
,SLOT(searchItem()));
 31 
 32 
 33 
 34 
    QHBoxLayout 
*
aHbox 
=
 
new
 QHBoxLayout;
 35 
    aHbox
->
addWidget(mClearBtn);
 36 
    aHbox
->
addWidget(mItem);
 37 
    aHbox
->
addWidget(mSearchBtn);
 38 
 39 
    QVBoxLayout 
*
aVbox 
=
 
new
 QVBoxLayout;
 40 
    aVbox
->
addLayout(aHbox);
 41 
    aVbox
->
addWidget(mResult);
 42 
    setLayout(aVbox);
 43 
}
 44 
 45 
 46 
 47 
QString Dialog::getResult()
 48 
{
 49 
    FILE 
*
fp;
 50 
 51 
    
char
 tem;
 52 
    
char
 buffer[
2000
],final[
200
];
 53 
    
int
 line 
=
 
1
,counti
=
0
,token 
=
 
0
,finalcount
=
0
;
 54 
 55 
    fp 
=
 fopen(
"
/home/archy/newfile
"
,
"
r
"
);
 56 
 57 
    
while
((tem 
=
 fgetc(fp))
!=
EOF)
 58 
    {
 59 
        
if
(tem
==
'
\n
'
)
 60 
        {
 61 
              line
++
;
 62 
              
if
(line
==
427
)
 63 
              {
 64 
                    
break
;
 65 
              }
 66 
        }
 67 
            
//
line++;
 68 
    }
 69 
 70 
    fgets(buffer,
2000
,fp);
 71 
 72 
    
while
(buffer[counti]
!=
'
\n
'
 
&&
 counti 
<
 
2000
)
 73 
    {
 74 
            
if
(buffer[counti] 
==
 
'
<
'
)
 75 
            {
 76 
                    token  
=
 
0
;
 77 
            }
 78 
            
else
 
if
(buffer[counti] 
==
 
'
>
'
)
 79 
            {
 80 
                    token 
=
 
1
;
 81 
            }
 82 
            
else
 
if
(buffer[counti] 
!=
 
'
>
'
 
&&
 buffer[counti] 
!=
 
'
<
'
 
&&
 token 
==
 
1
)
 83 
            {
 84 
                    final[finalcount] 
=
 buffer[counti];
 85 
                    finalcount 
++
;
 86 
            }
 87 
            counti 
++
;
 88 
    }
 89 
 90 
    final[finalcount] 
=
 
'
\0
'
;
 91 
 92 
    
//
QMessageBox msgBox;
 93 
    
//
msgBox.setText(final);
 94 
    
//
msgBox.exec();
 95 
 96 
    
//
 97 
    QString 
string
 
=
 QString(QLatin1String(final));
 98 
//
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
 99 
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName(
"
UTF-8
"
));
100 
    
return
 
string
;
101 
}
102 
103 
104 
void
 Dialog::clearItem()
105 
{
106 
    mItem
->
setText(
""
);
107 
}
108 
109 
void
 Dialog::searchItem()
110 
{
111 
112 
113 
    
if
(mItem
->
text() 
!=
 
""
)
114 
    {
115 
        getpage(mItem
->
text());
116 
        QString astring 
=
 getResult();
117 
118 
        
//
QMessageBox msgBox;
119 
        
//
msgBox.setText(astring);
120 
        
//
msgBox.exec();
121 
122 
        mResult
->
setText(astring);
123 
    }
124 
}
125 
126 
127 
Dialog::
~
Dialog()
128 
{
129 
130 
}

 

还有一个问题就是乱码的问题。

 因为是提取的网页,只能一个char一个char那样提取,现在还是没有想到什么其他办法提取。之后在char[] 转 QString 的时候,总是乱码。

 

 哪位博友知道怎么解决的话,请给点线索。

转载于:https://www.cnblogs.com/archy_yu/archive/2011/08/07/2130349.html

你可能感兴趣的文章
mysql中实现类似oracle中的nextval函数
查看>>
使用按键精灵+umdh定位内存泄露问题的方式
查看>>
RecyclerView实现ViewPager效果
查看>>
Bandicam视频录制技巧总结+小丸工具箱压缩视频解决视频体积问题
查看>>
JSP实现用户登录样例
查看>>
搞笑的W3C和M$对DOM中属性命名
查看>>
[Struts]让Dreamweaver显示Struts标签的插件
查看>>
便利的html5 之 required、number 、pattern
查看>>
[LeetCode] Find K Pairs with Smallest Sums 找和最小的K对数字
查看>>
VC6.0 C++ 如何调用微软windows系统SDK 语音API
查看>>
Python 3.5 RuntimeError: can&#39;t start new thread
查看>>
POJ 1659 Frogs&#39; Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】
查看>>
数字统计问题
查看>>
Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager
查看>>
SharpMap简析
查看>>
使用类加载器加载配置文件/getClassLoader().getResourceAsStream()
查看>>
配置 linux-bridge mechanism driver - 每天5分钟玩转 OpenStack(77)
查看>>
matplotlib绑定到PyQt5(有菜单)
查看>>
iOS - QRCode 二维码
查看>>
记录第一次纯手打爬虫经历
查看>>