天天看點

Qt 表格&清單資料驅動化(c++)

Qt 表格&清單資料驅動化(c++)

原文位址:http://www.cnblogs.com/chuncn/archive/2012/07/30/2615481.html

一、 Qt表格&清單 展示效果描述化與資料綁定驅動化

Qt 表格&清單資料驅動化(c++)

調用及解說如下:

QStringList formats;

formats.append(

"0~股票代碼~code~~72~~|"

);

formats.append(

"0~股票名稱~name~~180~~|"

);

formats.append(

"1~現價~AnimalCell~1|3~64~~zjcj|zdf"

);

formats.append(

"1~漲跌幅~AnimalCell~0|2|1~72~~zdf|zdf"

);

formats.append(

"1~行業力道~AnimalCell~0|2|0|blue~72~~hyld|black"

);

formats.append(

"1~漲跌分布~ChangeBar~~128~~up|up5|down|down5"

);

formats.append(

"1~短期強弱~RatingBar~~118~~oldhysrps|hysrps"

);

formats.append(

"1~狀态~ZdBar~~32~~zdf"

);

formats.append(

"1~綜合~ZhpmBar~~32~~zjcj|hysrps"

);

formats.append(

"1~分析師~ZhpmBar2~~42~~hysrps"

);

formats.append(

"1~市淨率~AnimalCell~0|2|0|black~72~~P/E|black"

);

formats.append(

"1~行業力道~AnimalCell~0|2|0|black~72~~P/B|black"

);

formats.append(

"1~市現率~AnimalCell~0|2|0|black~72~~P/S|black"

);

formats.append(

"1~市銷率~AnimalCell~0|2|0|black~72~~P/CF|black"

);

//ui->tableWidget 表示QTableWidget控件,該控件雖然傳統但非常靈活,QTableView雖然可以使用資料模型,但展示需要重繪,意味着要寫不少代碼且需要編譯,這是我選擇前者的原因。

//pMRS是資料集,是一個二維表,可以具有任意行列及其資料

//CommonStudio::AutoBindingToDataGrid函數隻需要傳入QTableWidget、約定資料,描述資訊,即可将約定資料按照描述資訊來展示。

CommonStudio::AutoBindingToDataGrid(ui->tableWidget, pMRS,formats,

this

);

  如上所圖及解說所示,隻需要寫好描述資訊formats,将QTableWidget控件、資料集以及描述資訊傳入CommonStudio::AutoBindingToDataGrid函數,即可實作上圖所展示的效果。進一步講,請求回來的相同資料集,不同描述資訊,展示效果不同。

  對于理财産品(終端),或者說所有的應用程式來說,表格是很常見的,可動不動就要寫和修改代碼并且編譯和讓使用者更新是很累的事情,本文這樣的做法,可以将描述資訊存在背景(資料庫中),這樣需求發生更改時,修改資料庫中對應描述即可。其二,隻要維護一處,處處都可以得到更新,随時控件資源的開發和擴充,展示出來的效果和功能将會更加豐富和強大。

二、傳統表格資料裝載與展示

//構造函數裡初始化表格&清單

MyWidget::MyWidget(QWidget *parent) :

QWidget(parent),

ui(

new

Ui::MyWidget)

{

ui->setupUi(

this

);

this

->setObjectName(

"Module1"

);

indexTable=

new

QTableWidget(0,5,

this

);

qsgTable=

new

QTableWidget(0,5,

this

);

newsTable=

new

QTableWidget(0,3,

this

);

industryTable=

new

QTableWidget(0,6,

this

);

zhphTable=

new

QTableWidget(0,15,

this

);

CommonStudio::InitTableWidget(indexTable,

false

,

true

);

CommonStudio::InitTableWidget(qsgTable,

false

,

true

);

CommonStudio::InitTableWidget(newsTable,

false

,

true

,

false

,

false

);

CommonStudio::InitTableWidget(industryTable,

true

,

true

);

CommonStudio::InitTableWidget(zhphTable,

true

,

true

);

QStringList header;   

header<<

""

<<tr(

"Name"

)<<tr(

"Zjcj"

)<<tr(

"Zd"

)<<tr(

"Zdf"

);

//QLatin1String

indexTable->setHorizontalHeaderLabels(header);

header.clear();

header<<

""

<<tr(

"Name"

)<<tr(

"Zhpf"

)<<tr(

"Zjcj"

)<<tr(

"Zdf"

);

qsgTable->setHorizontalHeaderLabels(header);

header.clear();

header<<

""

<<tr(

"HyName"

)<<tr(

"HyZdf"

)<<tr(

"Zdfb"

) << tr(

"LzName"

) << tr(

"LzZdf"

);

industryTable->setHorizontalHeaderLabels(header);

header.clear();

header<<

""

<<tr(

"Name"

) << tr(

"Code"

) << tr(

"Zhpf"

) << tr(

"Dqqr"

) << tr(

"Cqqr"

) << tr(

"Zjcj"

) << tr(

"Zdf"

) << tr(

"Lb"

)

<< tr(

"Hsl"

) << tr(

"Open"

) << tr(

"High"

) << tr(

"Low"

) << tr(

"Volume"

) << tr(

"Amount"

);

zhphTable->setHorizontalHeaderLabels(header);

indexTable->setColumnHidden(0,

true

);

indexTable->setColumnWidth(1,66);

indexTable->setColumnWidth(2,66);

indexTable->setColumnWidth(3,54);

indexTable->setColumnWidth(4,54);

qsgTable->setColumnHidden(0,

true

);

qsgTable->setColumnWidth(1,66);

qsgTable->setColumnWidth(2,66);

qsgTable->setColumnWidth(3,54);

qsgTable->setColumnWidth(4,54);

newsTable->setColumnHidden(0,

true

);

newsTable->setColumnWidth(1,200);

newsTable->setColumnWidth(2,40);

industryTable->setColumnHidden(0,

true

);

industryTable->setColumnWidth(1,200);

industryTable->setColumnWidth(2,54);

industryTable->setColumnWidth(3,320);

industryTable->setColumnWidth(4,100);

industryTable->setColumnWidth(5,54);

zhphTable->setColumnHidden(0,

true

);

zhphTable->setColumnWidth(1,88);

zhphTable->setColumnWidth(2,64);

zhphTable->setColumnWidth(3,64);

zhphTable->setColumnWidth(4,114);

zhphTable->setColumnWidth(5,114);

zhphTable->setColumnWidth(6,88);

zhphTable->setColumnWidth(7,88);

zhphTable->setColumnWidth(8,88);

zhphTable->setColumnWidth(9,88);

zhphTable->setColumnWidth(10,88);

zhphTable->setColumnWidth(11,88);

zhphTable->setColumnWidth(12,88);

zhphTable->setColumnWidth(13,88);

zhphTable->setColumnWidth(14,88);

..............................................不一一例出

}

//資料回調函數,資料回來後,裝載或更新到表格&清單

void

MyWidget::receiveDataSlot(

int

vol, ENORecordset **pMRS, QVariant etag)

{  

ETagData realEtag;

realEtag = etag.value<ETagData>();

int

i=0;

int

poor;

int

row= pMRS[0]->RowsAffected();

int

column = pMRS[0]->FieldCount();

QString str;

if

(vol>=1){

QWidget *widget;

ZhpmBar *zhpfCtl;

ChangeBar *changeCtl;

RatingBar *ratingCtl;

AnimalCell *animalCtl;

QTableWidgetItem *item;

pMRS[0]->FetchFirst();

//Index hq list

if

(realEtag.nMainFunc==31000 && realEtag.nSubFunc==4)

{

poor = row - indexTable->rowCount();

if

(poor>0){

for

(

int

i=0;i<poor;i++)

indexTable->insertRow(indexTable->rowCount());

}

else

if

(poor<0){

poor=qAbs(poor);

for

(

int

i=poor-1;i>=0;i--)

indexTable->removeRow(i);

}

double

zdfD;

char

code[64],name[64],zjcj[64],zd[64],zdf[64],exchid[64];

while

(!pMRS[0]->IsEOF())

{

zdfD = pMRS[0]->ToFloat(

"zdf"

);

strcpy(code,pMRS[0]->ToString(

"code"

));

strcpy(name,pMRS[0]->ToString(

"name"

));

strcpy(zjcj,pMRS[0]->ToString(

"zjcj"

));

strcpy(zd,pMRS[0]->ToString(

"zhd"

));

strcpy(zdf,pMRS[0]->ToString(

"zdf"

));

strcpy(exchid,pMRS[0]->ToString(

"exchid"

));

TCHAR tchar[64];

ENOUtils::ToWChar(name,tchar,64);

//key

str.clear();

str.append(code);

str.append(

"."

);

str.append(exchid);

item=

new

QTableWidgetItem(str);

indexTable->setItem(i,0,item);

//name

item=

new

QTableWidgetItem(name);

indexTable->setItem(i,1,item);

........................這部分代碼太多,随時根據需求會改動的,不一一列出來了

i++;

pMRS[0]->FetchNext();

}

}

}

}

  

三、新方式與傳統做法的對比

  傳統方式下,需要不斷編寫和維護大量代碼,新方式下,開發人員隻需要編寫簡單少量的描述資訊,管理人員和經理人士無需開發經驗即可以通過管理定制子產品,傻瓜化的方式下選擇需要的列并設定每一列的展示效果(控件類型),以及對應的字段即可,包含展示的中文名稱、寬度、控件類型以及顔色等屬性(顔色可以是固定的,也可以像現價這樣根據漲跌度的正負号來顯示紅或綠色),就可以實作上圖效果。

  用戶端請求指令不同,就會得到不同的資料結果,新方式下,配和這樣的簡單描述,基本上可以實作各種複雜表格效果的展示和使用,随時表格的越來越多,新方式的工作量由于傻瓜定制式子產品(類似股票選股子產品及其操作)變得輕松、簡單、快速,而傳統方式則要面對大量代碼的編寫和維護,哪個更有優越不必多說了吧?

注:“管理定制子產品”可以錄入或選擇指定功能号(主子功能及參數),然後就出來字段資訊(英文是唯一的,中文則表示預設描述),使用者要展示那些就選擇那些出來,可以更新要展示時候的描述、描述、類型(比如這一列顯示為某個控件),以及該列對應到那些字段等等,操作就簡直就如選股,選好了點選确定,還可以請求資料并把展示效果顯示出來,之後可以将這些資訊儲存到指定資料庫中位置。

注:就當自己在選股,選好了,作為條件入選的列作為清單的列,資料等同請求回來的内容了,就這麼簡單。

注:新方式原來是在silverlight下實作過的,但sl下有各種限制,搞得描述資訊複雜龐大且有限制,不過到了Qt這兒就非常靈活和好使了,不想寫太多枯燥繁雜的代碼而創。

 四、理财應用表格統計

首頁    5個表格&清單

大勢..  2個表格

個股..  至少3個表格

行業..  2個表格

機構..  2個表格(10種展示組合,條件不同,表格展示内容不同)

組織..  2個表格(5種展示組合,同上)

對沖..  2個表格

交易決策 N個表格(N表示有點多)

市場雷達 6個表格

事件..  1表多展示(2*3=6種展示組合)

中山..  3個表格

智能選股 1個表格(目前選股出來的列都是固定的,有了本文中的利器,就可以把條件包含的列展示出來,而不是每次選股出來的結果列都一樣)

Qt

繼續閱讀