C++ 入門指南 - QString

Qt 的 QString 與標準程式庫 (standard library) 的 string 都是字串 (string) ,但 QString 與 string 是兩種不同的字串




QString 為了有別於 string ,所以額外加了前綴 Q ,這是兩個不同程式庫 (library) 定義的字串類別 (class) ,因此兩者有各自不同的成員 (member) 。


若是 Encrypt 的 toEncode() 或 toDecode() 回傳值 (return value) 直接套用需要 QString 的地方,這樣就會發生錯誤。解決這個問題有兩種途徑,第一種途徑就是回頭修改 Encrypt ,把處理字串的部分都改成 QString ,那麼到用 Qt 設計 GUI 就不會發生問題了。


第一種聽起來不賴!可是當我們要把 Encrypt 移植到其他 GUI 程式庫時,又會面臨 QString 無法適用其他程式庫,致使 Encrypt 需要再次修改才可移植。嗯,說真的,這會是個很麻煩的事情。


所以我們打算採取第二種途徑,依需要才將 QString 轉換成 string ,或把 string 轉換成 QString ,因此我們要增加兩個函數成員 (function member) s2q() 與 q2s()
QString s2q(const string &);  
string q2s(const QString &);


s2q() 以 string 當參數 (parameter) ,回傳 QString ,而 q2s() 以 QString 當參數,回傳 string 。


修改過後的標頭檔如下
#ifndef GUIDEMO_H
#define GUIDEMO_H

#include <QWidget>
#include <string>

class QLabel;
class QLineEdit;
class QPushButton;

class GUIDemo : public QWidget {
    Q_OBJECT

public:
    GUIDemo(QWidget *parent = 0);
    QString s2q(const string &);  
    string q2s(const QString &);

public slots:
    void inputContact();

private:
    QLabel *display;
    QLineEdit *inputField;
    QLineEdit *outputField;
    QPushButton *newButton;
    QPushButton *loadButton;
    QPushButton *saveButton;
    QPushButton *encodeButton;
    QPushButton *decodeButton;
    QPushButton *clearButton;
    QPushButton *copyButton;
    
    QString inputText;
};

#endif

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:GUIDemo.h
    功能:示範 C++ 程式 
    作者:張凱慶
    時間:西元 2012 年 10 月 */


s2q() 與 q2s() 都借助兩者各自有的函數成員與建構子 (constructor) 即可
QString GUIDemo::s2q(const string &s) {  
    return QString(QString::fromLocal8Bit(s.c_str()));  
}  

string GUIDemo::q2s(const QString &s) {  
    return string((const char *)s.toLocal8Bit());  
}


完整的實作檔 GUIDemo.cpp 如下
#include <QtGui>
#include "GUIDemo.h"

GUIDemo::GUIDemo(QWidget *parent) : QWidget(parent) {
    QLabel *input = new QLabel(tr("Input:"));
    QLabel *output = new QLabel(tr("Output:"));
    display = new QLabel(tr("something happened"));
    
    inputField = new QLineEdit;
    connect(inputField, SIGNAL(returnPressed()), this, SLOT(inputContact()));
    outputField = new QLineEdit;
    outputField->setReadOnly(true);
    
    newButton = new QPushButton(tr("New"));
    loadButton = new QPushButton(tr("Load"));
    saveButton = new QPushButton(tr("Save"));
    encodeButton = new QPushButton(tr("Encode"));
    decodeButton = new QPushButton(tr("Decode"));
    clearButton = new QPushButton(tr("Clear"));
    copyButton = new QPushButton(tr("Copy"));
    
    QGridLayout *layout = new QGridLayout;
    
    layout->addWidget(input, 0, 0);
    layout->addWidget(inputField, 0, 1, 1, 6, 0);
    
    layout->addWidget(output, 1, 0);
    layout->addWidget(outputField, 1, 1, 1, 6, 0);
    
    layout->addWidget(newButton, 2, 0);
    layout->addWidget(loadButton, 2, 1);
    layout->addWidget(saveButton, 2, 2);
    layout->addWidget(encodeButton, 2, 3);
    layout->addWidget(decodeButton, 2, 4);
    layout->addWidget(clearButton, 2, 5);
    layout->addWidget(copyButton, 2, 6);
    
    layout->addWidget(display, 3, 0, 1, 7, 0);
    
    setLayout(layout);
    setWindowTitle(tr("GUIDemo"));
}

void GUIDemo::inputContact() {
    inputText = inputField->text();
    display->setText("Your input is '" + inputText + "'.");
}

QString GUIDemo::s2q(const string &s) {  
    return QString(QString::fromLocal8Bit(s.c_str()));  
}  

string GUIDemo::q2s(const QString &s) {  
    return string((const char *)s.toLocal8Bit());  
} 

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:GUIDemo.cpp
    功能:示範 C++ 程式 
    作者:張凱慶
    時間:西元 2012 年 10 月 */


轉換程式先準備好,然後我們要來整合 Encrypt 囉!


中英文術語對照
標準程式庫standard library
字串string
程式庫library
類別class
成員member
回傳值return value
函數成員function member
參數parameter
建構子constructor


您可以繼續參考
GUI 篇


相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁


參考資料
Qt Developer Network
QString Class Reference

沒有留言: