Posts Tagged ‘北呈’

QWebView保存帐号密码功能实现

星期三, 八月 13th, 2014 241 views

以下用QT模拟一下常规浏览器对帐号密码的保存

首先是获取QWebview中的表单内容,需要保存的表单中的两个input如下:

1
2
帐号:<input name="username" type="text"/>
密码:<input name="password" type="password"/>

在QT中获取这两个input的值的需要使用带JS的方法,首先通过findFirstElement()方法找到目标标签,然后调用js方法获取其值,如下:

1
2
3
//获取帐号密码
qDebug()< <ui->webView->page()->mainFrame()->findFirstElement("#username").evaluateJavaScript("this.value").toString();
qDebug()< <ui->webView->page()->mainFrame()->findFirstElement("#password").evaluateJavaScript("this.value").toString();

具体在何处调用以上方法视应用设计的情况而定,这里我使用了QWebview::loadStarted()信号来触发,因为提交表单时必会触发这个信号。
(更多…)

QT5读取及修改cookie简单样例

星期四, 七月 3rd, 2014 337 views

介于网上(中文网页)没有一篇完整的关于QT5读写cookie的简单案例,特有此篇。

①准备工作,定义cookie控制器
在开始获取cookie之前我们需要做一些准备工作,先在mainwindow下拖出一个webview,这里不上图了,以后会比较少上图,有些图华而不实,文字看得懂的自然都看得懂。
之后给这个webview定义一个networkAccessManager,#include什么的这些常识问题大家自己F1。

1
2
3
4
5
6
7
8
9
10
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    _cookieJar = new MyCookieJar();
    //这里设置networkAccessManager
    ui->webView->page()->networkAccessManager()->setCookieJar( _cookieJar );

}

上文中的_cookieJar是我们自己定义的一个MyCookieJar类,继承了QT自带的QNetworkCookieJar。
这里我自己封装了一些方法也放出来吧:

MyCookieJar.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef MYCOOKIEJAR_H
#define MYCOOKIEJAR_H
#include <qnetworkcookiejar>
#include <qnetworkcookie>
#include <qnetworkrequest>
class MyCookieJar : public QNetworkCookieJar
{
    Q_OBJECT
public:
    explicit MyCookieJar(QObject *parent = 0);

    QList<qnetworkcookie> getCookies();
    void setCookies(const QList</qnetworkcookie><qnetworkcookie>& cookieList);
    void addCookies(QString name,QString value);
    void changeCookie(QString name,QString value);
};
#endif // MYCOOKIEJAR_H
</qnetworkcookie></qnetworkrequest></qnetworkcookie></qnetworkcookiejar>

MyCookieJar.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "mycookiejar.h"

MyCookieJar::MyCookieJar(QObject *parent) :
    QNetworkCookieJar(parent)
{
}


QList<qnetworkcookie> MyCookieJar::getCookies()

{
    return  this->allCookies();
}

void MyCookieJar::setCookies(const QList</qnetworkcookie><qnetworkcookie>& cookieList)
{
    if(this == NULL)
        return;
    this->setAllCookies(cookieList);
}

void MyCookieJar::addCookies(QString name,QString value)
{
    QNetworkCookie cookie(name.toUtf8(),value.toUtf8());
    this->insertCookie(cookie);
}

void MyCookieJar::changeCookie(QString name,QString value)
{
    QNetworkCookie cookie(name.toUtf8(),value.toUtf8());
    this->updateCookie(cookie);

}
</qnetworkcookie>

(更多…)

一句话解决ASP.NET中文表单提交乱码问题

星期五, 十月 4th, 2013 37 views

通常在.NET链接数据库使用中文做为SELECT的条件时,如果出现无法找到等异常情况,可以先确认一下是否是从表单提交过来的中文出现了乱码。
针对乱码我们可以尝试如下方法。
在Web.config中的节点里添加如下语句:

1
 <globalization requestEncoding="GB2312" responseEncoding="GB2312"/>

OK一切搞定。

BeiTown
2013.10.04

ASP.NET使用GridView对数据库快速操作

星期四, 九月 19th, 2013 24 views

①绑定及显示数据

首先在界面中创建一个SqlDataSource和一个GridView控件,配置SqlDataSource绑定到指定数据库的某一个表(例如某test表)。接下来将这个数据源绑定到GridView中(自动生成需要的行列),效果如图

此时编译运行程序即可看到test表中的内容,这段界面的代码如下(自动生成)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="id" DataSourceID="SqlDataSource1" style="margin-right: 34px">

            <Columns>
                <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
                   ReadOnly="True" SortExpression="id" />
                <asp:BoundField DataField="userName" HeaderText="userName"
                   SortExpression="userName" />
                <asp:BoundField DataField="passWord" HeaderText="passWord"
                   SortExpression="passWord" />
                <asp:BoundField DataField="Role" HeaderText="Role" SortExpression="Role" />
            </Columns>
        </asp:GridView>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
           ConnectionString="<%$ ConnectionStrings:mytestConnectionString %>"
            SelectCommand="SELECT * FROM [test] ORDER BY [id]">
        </asp:SqlDataSource>

②对数据进行编辑
如图点击GridView右侧的按钮添加一个列,在这个列中加入编辑按钮

此时会生成如下一段代码

1
 <asp:CommandField ShowEditButton="True" />

编译运行程序效果如图

点击界面上的[编辑]出现如图

即可对数据库test表的目标行进行修改,点击[修改]即可执行UPDATA命令。

以上即快速实现了一个对数据库表进行修改的Demo。

总结:
此方案的优点是开发异常迅速,基本不用编写代码即可完成对数据库表的显示、查询、以及修改。
但弊端也是由于代码编写量少,无法加入更多的逻辑内容。

BeiTown
2013.09.19

ASP.NET 数据库(SQL SERVER)操作的最简Demo

星期一, 九月 2nd, 2013 148 views

首先创建一个数据库操作基类DB.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.Security.Cryptography;
/// <summary>
///DB 的摘要说明
/// </summary>
public class DB
{
    public static string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    public DB(){}

    /// <summary>
    ///创建连接
    /// </summary>
    public SqlConnection GetConnection()
    {
        return new SqlConnection(connectionString);
    }

    /// <summary>
    ///执行语句并返回行数
    /// </summary>

 <a href="http://coder.beitown.com/archives/1014#more-1014" class="more-link">(更多...)</a>

SQLSERVER 快速清空数据表方法

星期五, 八月 2nd, 2013 19 views

在日常运维中我们常常会需要清空一些数据库的表数据,常规方法是使用DELETE语句

1
DELETE FROM [表名]

此方法的优点是可以根据条件删除数据(在表名后加where),但当需要全部清空一个表时使用此方法则会显得非常缓慢,因为DELETE是逐条删除的。
所以通常清空表时可以使用TRUNCATE TABLE来清空数据表

1
TRUNCATE TABLE [表名]

此方法无论数据库表有多少行数据都是秒删,其本质就是重建一个空表的意思。

当然有时候需要条件删除也可以使用此方法,即首先备份需要保留的数据到另一个临时表中,将本表清除后再将临时表的数据插入到本表中,方法如下

1
2
3
4
5
6
7
8
9
IF object_id('tempdb..#[临时表]') IS NOT NULL --确认是否已存在
BEGIN  
      DROP TABLE #temp_table --删除待用临时表
END

SELECT * INTO #临时表 FROM [本表] WHERE 条件 --创建临时表并拷贝数据
TRUNCATE TABLE [本表] --重建表
INSERT [本表] SELECT * FROM #临时表 --将临时表插入本表
DROP TABLE #临时表 --删除临时表

更多SQL操作技巧欢迎交流讨论,谢谢关注。

BeiTown
2013.08.02

SQLSERVER查询表行数和列数

星期四, 八月 1st, 2013 22 views

①返回表行(记录)数

1
SELECT COUNT(*) AS 行数 FROM 表名

②返回表列(字段数)

1
SELECT COUNT(*) AS 列数 FROM syscolumns WHERE (id = OBJECT_ID( '表名'))

BeiTown
2013.08.01

SQL使用游标对Select结果集循环操作

星期二, 七月 30th, 2013 76 views

首先先简述一下SQL中游标的作用,我们可以将游标理解成一个数组或是一个队列,其保存了Select的结果集的地址队列。
当我们需要对Select的结果集进行循环操作时,可以先定义一个游标,并将结果集指向到这个游标当中,使用游标像指针一样访问这个结果集,如下

①声明游标

1
2
3
DECLARE @id INT --声明一个变量id
DECLARE cur CURSOR read_only FOR --声明一个名为cur的游标
SELECT Userid FROM UserTable WHERE ...... --某Select语句

上述代码意为声明一个游标指向某Select语句的结果集,read_only的意思是这个指针只用于读取,如果更新则需要使用update,这样做的好处是可以明确游标的针对性从而提高执行效率。
DECLARE @id int 意为声明一个变量id,后续会用于从游标指向的结果集中获取数据

创建完游标之后,现在需要打开这个游标并进行操作,语法如下:

②打开游标并读取游标数据

1
2
3
4
5
6
7
8
OPEN cur
Fetch NEXT FROM cur INTO @id --将cur中的下一个数据赋值给变量id

WHILE(@@FETCH_STATUS = 0)
BEGIN
    --要执行的SQL语句
    fetch NEXT FROM cur INTO @id
END

Fetch 的语法如下
Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From 游标名 INTO @变量1,@变量2…

Next:返回结果集中当前行的下一行记录
Prior:返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。
First:返回结果集中的第一行记录,并且将其作为当前行。
Last:返回结果集中的最后一行,并且将其作为当前行。
Absolute n:当 n > 0 时返回从游标头开始的第n行,并且将其作为当前行;n < 0 时返回从游标末尾开始的第n行,并且将其作为当前行;n = 0 时返回当前行。
Relative n:当 n > 0 时返回从当前行之后的第n行;n < 0 时则返回当前行之前的第n行;n = 0 时返回当前行。

开启游标后,游标指针位于-1行,因此需要使用FETCH NEXT移动到Select的结果集的第一行,
WHILE(@@FETCH_STATUS = 0)循环判断是否有数据,满足条件时将执行Begin和End之间的语句。
每次执行完之后注意使用 Fetch NEXT 移动到下一行。
(更多…)

批处理统计指定服务器端口TCP连接数及拓展工具编写

星期一, 七月 29th, 2013 36 views

最近要对服务器指定端口进行连接数统计,服务器的一些防火墙自带了此功能,但是有时防火墙对流量影响较大,需要关闭防火墙,因此尝试使用批处理创建一个简单查看工具
首先看核心语句

1
2
@echo off
netstat -an | find ":80 " | find "ESTABLISHED" /c

该语句的意思是在netstat -an 的结果中查找满足”:80″的结果 再在其中查找满足 “ESTABLISHED” 的结果 并/c 统计行数
@echo off 的意思是关闭输入命令的回显
接下来我们可以设置其1秒钟执行一次

1
2
3
4
5
6
:loop

//这里加入待循环的语句
timeout /t 1

go loop

此时即基本满足了对指定端口连接数的实时统计。

接下来将进一步利用批处理建立一个迷你的查看工具,首先是定义一下窗口的大小、字体和背景颜色以及标题:

1
mode cols=40 lines=10 & color 2f & title 标题

上述语句意为设置 列数40 行数10 颜色4f(后续有值说明) 以及标题

关于Color的说明如下:

COLOR [attr]

attr 指定控制台输出的颜色属性

颜色属性由两个十六进制数字指定 — 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

0 = 黑色   8 = 灰色
1 = 蓝色   9 = 淡蓝色
2 = 绿色   A = 淡绿色
3 = 浅绿色   B = 淡浅绿色
4 = 红色   C = 淡红色
5 = 紫色   D = 淡紫色
6 = 黄色   E = 淡黄色
7 = 白色   F = 亮白色

结合一下整体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
mode con cols=40 lines=10 & color 2f & title BeiTown端口连接数查看器
:loop
    cls
    @echo 当前80端口连接数:
    echo.
    echo.
    netstat -an | find ":80 " | find "ESTABLISHED" /c
    echo.
    echo.
    timeout /t 1
goto loop

将此代码保存为bat格式文件,直接执行即可。
效果如图:

在下一节中我们将简述如何将批处理的回显存入变量中用于进一步编程。

本篇先到此,谢谢关注。

BeiTown
2013.07.29

C++在windows下创建线程范例

星期一, 六月 17th, 2013 27 views

虽然简单,但依旧记录一下,接触和使用的语言太多,长时间不用这门语言就容易遗忘,仅当日记吧。

在windows下,常常使用SDK win32 api来编写多线程的程序,实现方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>

//Fun为自定义的线程函数
DWORD  WINAPI  Fun( LPVOID  lpParamter )
{
    while(1) {

        printf("新线程正在执行...");

    }
}

int main()
{
    HANDLE  hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);//创建线程
    return 0;
}

以上为最简实现方法。

其他拓展后续添加。

本文到此,谢谢关注。

 

BeiTown

2013.06.17