2012年9月1日 星期六

Play Store大特價"End of Summer Sale"




最近Google Play Store又提供了一系列的付費遊戲軟體大降價了,Play Store 內有 16 個Apps/Games 推出減價,部份減幅更達 80%。如果下面遊戲是你正物色很久的,但遲遲尚未下手的,這次特價,就給他買回來了吧。


台灣如何購買請看上一篇文章

透過BlueStacks購買Android付費軟體

在台灣使用Android系統,因為台北市政府的關係,導致Google出走台灣已經一段時間了,我看目前要恢復付費功能,在短時間內應該沒有辦法了,山不轉路轉,今天教大家如何透過新增一台BlueStacks模擬器,讓你可以購買付費軟體,首先你必須先前往下載BlueStacks。
點選Download Now進入下載頁面

安裝步驟很簡單,就不斷地點選下一步即可,安裝完成後你將可以在Windows環境下模擬出一台Android裝置,如下圖。


接下來需登入您的Google帳號已註冊你的Android裝置,點選右下角的設定,並點選Manage Accounts 登入你的Google帳號。

完成此動作之後,請回到電腦中,利用瀏覽器開啟 https://play.google.com/apps 進入Play商店中的我ANDROID應用程式,此時你將會發現新增了一台"T-Mobile Samsung GT-N7000"裝置,該裝置使用T-Mobile作為sim卡,所以你在台灣還是可以裡用他購買付費軟體。

當你新增完成之後就快要接近可以購買付費軟體的動作了,接下來你要在Google新增你的信用卡資訊,請進入Google Wallet,Google電子錢包網站
並於付款方式填入你的信用卡資訊


接下來你就可以購買一個付費軟體了,首先一樣使用Windows中之瀏覽器,並搜尋一付費軟體
此時你會發現購買的金額出現了,並且下面的相容性出現了可以購買的選項了

觀看詳細資訊,你會發現"T-Mobile Samsung GT-N7000"這個裝置是可以購買的,接下來你就可以點選購買進行軟體購買的動作了

確認無誤請點選繼續進入購買
若你無出現Google Wallet訊息,代表你尚未新增任何信用卡,如果有將可以點選購買進入結帳

看到這裡你已經順利購買成功了。並且於虛擬機中也已經順利安裝成功了

當在其他裝置購買之後,如何在真實的機器中進行安裝呢?首先進入Play Store,點選我的應用程式,再點選全部,此時你將可以看到你所購買的應用程式,並且會顯示已購買,若你的系統可以支援該軟體,將可以出現安裝的畫面。用這樣的方式購買到底有沒有風險,當然部分因為平板的關係,有些遊戲是不支援的,如果你出現下面畫面,代表你的裝置不支援該軟體,建議你直接點選退款,進入退款步驟。

Sony Tablet S無法支援該遊戲,那只好讓我的Xperia S玩了,利用上述相同的方式進入安裝













結論:
目前因為台北市政府與Google play Store的退費機制談不攏,導致Google放棄了台灣這個市場,利用這樣的方式可以讓你不需刷機,不需要root,也不需要使用國外的sim卡就可以購買,目前使用這樣的方式幾乎什麼軟體都可以進入購買,並且不會出現任何錯誤,或是不能交易的問題,但用此方式購買的軟體,如果有更新訊息,play Store將不會自動更新,你必須回到安裝的畫面,如果有提示更新,再進行更新的動作,目前大概就只有這一點較不方便,其餘該方式真的是一個不錯購買付費軟體的方式。

2012年8月7日 星期二

[Qt] - built-in 對話方塊

Qt內建了一些程式設計師常常會使用到的一些對話方塊,其中包含顏色選取檔案瀏覽等等。這些都屬於固定式的對話視窗,當你要使用時將可以直接使用Qt內建之對話方塊進行選取即可。本章捷將介紹Qt內建之(built-in)方塊。
Qt除了內建QMesseageBox訊息方塊外,Qt也提供了其他的內建方塊,其中包含
  1. QColorDialog:色彩選取工具。
  2. QErrorMessage:顯示錯誤訊息視窗。
  3. QFileDialog:檔案選取視窗。
  4. QFontDialog:使用者選取字型工具。
  5. QInputDialog:使用者簡單輸入工具。
  6. QPageSetupDialog:配置印表機選項。
  7. QProgressDialog:處理程序進度列。
  8. QPrintDialog:印表機列印方塊
Step1.
首先你要新增一個TextEdit及八個PushButton,相關Object名稱及屬性如下表所示,並將ui設計如下圖所示。
LabelObjectObjectName

QTextEditdisplayTextEdit
ColorQPushButtoncolor_B
MessageQPushButtonMessage_B
FileQPushButtonFile_B
FontQPushButtonFont_B
InputQPushButtonInput_B
Page SetupQPushButtonPageSetup_B
ProgressQPushButtonProgress_B
PrintQPushButtonPrint_B

Step2.
include所需之檔案,於mainwindow.hpp中加入#include <QtGui/QDialog>,及mainwindow.cpp檔案中加入#include <QtGui/QtGui>。

Step3.
於個別button中加入相關程式碼。

Color
    QPalette palette = ui->displayTextEdit->palette();
    const QColor& color
            = QColorDialog::getColor(palette.color(QPalette::Base), this);
    if(color.isValid())
    {
        palette.setColor(QPalette::Base, color);
        ui->displayTextEdit->setPalette(palette);
    }                                                                                                                                                   


執行結果如下圖所示。



Message
    QErrorMessage box(this);
    box.setWindowTitle(tr("MessageBox"));
    box.showMessage(tr("MessageBox xx));
    box.showMessage(tr("MessageBox xx));
    box.showMessage(tr("MessageBox xx));
    box.showMessage(tr("MessageBox yy));
    box.showMessage(tr("MessageBox zz));

    box.exec();                                                                                                                                   

執行結果如下圖所示。

File
    QString fileName = QFileDialog::getOpenFileName(this,
                                    tr("Open File"),
                                    "/home/trong/",
                                    tr("Any File(*.*)"
                                    ";;Text File(*.txt)"
                                    ";;XML File(*.xml)"));
    ui->displayTextEdit->setText(fileName);                                                                                       

執行結果如下


Font
    bool ok;
    const QFont& font = QFontDialog::getFont(&ok,
                             ui->displayTextEdit->font(),
                             this,
                             tr("Font Select box"));
    if(ok)
    {
        ui->displayTextEdit->setFont(font);
    }                                                                                                                                                    

執行結果

Input
    bool ok;
    QString text = QInputDialog::getText(this,
                                    tr("Input"),
                                    tr("Input Text:"),
                                    QLineEdit::Normal,
                                    QDir::home().dirName(),
                                    &ok);
    if (ok && !text.isEmpty())
        ui->displayTextEdit->setText(text);                                                                                       

執行結果

Page Setup
    QPrinter printer;
    QPageSetupDialog dlg(&printer, this);
    dlg.setWindowTitle(tr("Page Setup Box"));
    if (dlg.exec() == QDialog::Accepted)
    {
            // GO To Next process
    }                                                                                                                                                  


Progress
    QProgressDialog progress(tr("Processing..."), tr("Cancel"), 0, 10000, this);
    progress.setWindowModality(Qt::WindowModal);
    progress.setWindowTitle(tr("Processing Box"));
    progress.show();
    for (int i = 0; i < 10000; i++)
    {
            progress.setValue(i);
            qApp->processEvents();
            if (progress.wasCanceled())
                    break;
            //
            qDebug() << i;
    }
    progress.setValue(10000);                                                                                                             


Print Page
    QPrinter printer;
    QPrintDialog dlg(&printer, this);
    dlg.setWindowTitle(tr("Print Box"));
    if (dlg.exec() == QDialog::Accepted)
    {
            // next processing
    }                                                                                                                                                  



參考文獻:精通Qt4視窗介面程式開發與設計

[Qt] - Dialog 排版


在這個章節裡面,我們將教導你們如何去產生一個Dialog視窗,並且如何去做簡單的排版。首先先建立一個Qt GUI application專案,這邊與我們之前所建立之MainWindow方式有點不同,因為我們要建立一個Dialog專案,所以必須在Class infomation設定中,將Base class選擇QDialog,如下圖所示。

接下來新增幾個ui物件。1.TexeLabel、2.Line Edit、3. Horizontal Spacer、4.pushButton。其排列方式如下。


ui物件相關屬性修改如下
ui物件objectNamelabel
1.TexeLabellabelCell Location:
2.Line EditlineEdit
3. Horizontal Spacer

4.pushButtonokButtonOK
5.pushButtoncancelButtonCancel

按住"Ctrl"並點選ui物件""textLabel與LineEdit後,點選滑鼠右鍵開啟選單,點選Layout->LayOut Horizontally進行水平排列,再利用相同方式點選"Horizontal Spacer"及兩個"pushButton"並利用相同方式進行水平排列,最後將兩個進行水平排列之物件,利用相同方式Layout->LayOut Vertically 進行垂直排列,做完上述動作之後所有ui物件將完成較規則的排列方式。如果你覺得物件間的距離還不是很好,你可以再度點選Layout->Adjust Size進行重新排列大小,其結果如下所示。


輸入表單中同常伴隨Tab按鍵進行物件間資切換,此時你可以編輯你的tab順序,點選Edit->Edit Tab Order進入編輯畫面。


此時將出現tab編輯畫面,畫面中之1、2、3所代表的就是你點選tab按鈕時,所切換的順序,你可以點選你要的位置,進行編輯順序,編輯還成後點選"F3"恢復Edit Widgets介面。

UI介面設計完成之後,如果你要先觀看該UI介面是否如你預期的結果,你可以點選Tools->Form Editor->Preview進行預覽。

接下來建立幾個簡單上面建立之UI之基本動作,打開dialog.cpp檔案,假設我們預先設定lineEdit在未輸入文字的時候不可以按下ok按鈕,並且限定lineEdit中第一個字只可以輸入英文單字,第二三只可以輸入數字,且只能輸入這三個字,那要如何進行設計呢?



於dialog.cpp檔案中新增下列程式碼。
    //預先將okButton按鈕進行關閉動作
    ui->okButton->setEnabled(false);
   
    //設定一regExp屬性,改屬性中限制,第一個單字[A-Za-z]也就是說只可以輸入英文單字,第二格[1-9]只能輸入數字1-9,第三個[0-9]只能輸入數字,最後{0,2}代表輸入字元由0-2也就是三個字元,並將該屬性設定給lineEdit使用
    QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
    ui->lineEdit->setValidator(new QRegExpValidator(regExp,this));

    //最後新增按鈕動作,下列方式均可以將Dialog進行關閉,而acceot(0將可於QDialog::Accept()回傳1,reject則回傳0,利用該方式可以進行動作傳遞
    connect(ui->okButton,SIGNAL(clicked()),this,SLOT(accept()));
    connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(reject()));

最後於lineEdit ui上面點選右鍵,Go to slot,點選textChanged(QStrong)進行新增動作,該動作將於lineEdit輸入文字後啟動,該啟動內容主要判定lineEdit有輸入文字,且輸入文字都符合上面regExp規則的話,將okButton啟用,其程式碼如下所示。

ui->okButton->setEnabled(ui->lineEdit->hasAcceptableInput());

執行結果如下


接下來我們嘗試處理按鈕按下後的事件,按鈕按下的事件你可以使用點選右鍵的方式新增Go to slot的方式建立點擊事件,也可以如我上述所使用之方式,直接用SLOT的方式指定要執行的指令。我們在這邊預計讓你點選ok之後會出現一個MessageBox視窗,顯示OK訊息。點選Cancel按鈕之後會出現警告視窗,會出現警告視窗,問你是否關閉。首先在dialog.hpp檔案中include QMessageBox函式庫進來。

#include <QMessageBox>

接下來在private:中加入

    void accept();
    void reject();

再開啟dialog.cpp檔案,並於最下方輸入該兩個動作所要執行的內容,建立MessageBox的方式很簡單,你可以直接使用QMessageBox來建立QMessageBOX::後面所帶的屬性為MessageBox所顯示的圖示,其中包含about、aboutQt、infomation、question、warning、critical等。輸入屬性(QWidget *parent,const QString &title,const QString &text),使用方式如下。
//accept動作
void Dialog::accept()
{
    QMessageBox::about(this,tr("ok"),tr("ok"));
}

//reject動作
void Dialog::reject()
{
   
    QMessageBox box;
    box.setWindowTitle(tr("Exit!"));
    box.setIcon(QMessageBox::Question);
    box.setText(tr("Are you sure want to cancel?"));
    box.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel);
    box.setDetailedText(tr("test"));
    switch(box.exec())
    {
        case QMessageBox::Yes:
            QDialog::done(1);
            break;
        case QMessageBox::No:
         
            break;
    }

}

第二個動作reject中,相同使用QMessageBox的方式建立,但比較不相同的地方在於我們直接設定相關屬性,該方式可以讓你針對該屬性一一進行設定,並於最後用switch的方式來判定所按下的按鈕,並執行想要執行的指令,其做法如上所示。

MessageBox::about

MessageBox::question

MessageBox::warrning

MessageBox::infomation

MessageBox::critial




See also