2008年12月26日 星期五

Qt - QTextEdit自動捲到底

目標:封裝QTextEdit,使其可以在加入文字時,讓垂直捲軸能夠捲到底,方便當作log的需求

DebugLog::DebugLog(QWidget *parent)
    : QTextEdit(parent)
{
    setReadOnly(true); //由於是做log用,所以不需要寫的存取
    connect( this, SIGNAL(textChanged()), this, SLOT(autoScrollDown()));
}

void DebugLog::autoScrollDown()
{
    //方法1
    QTextCursor c = textCursor();
    c.movePosition(QTextCursor::End);
    setTextCursor(c);
   
    /*//方法二
    QScrollBar *sb = verticalScrollBar();
    sb->setValue(sb->maximum());
    */
}

主要是連接textChanged() 和 autoScrollDown(),當QTextEdit內容改變時, 就使用上面兩個方法來捲到底,兩種都已驗證

Qt版本: 4.4.3

參考資料
http://www.qtcentre.org/forum/archive/index.php/t-5983.html 

2008年12月24日 星期三

TRichEdit自動捲到底

C++ Builder 中的 TRichEdit 元件,可以提供比TMemo元件較多的視覺效果
 ,但有一個小缺點,當使用 RichEdit1->Lines->Add("") 或者 RichEdit2->Lines->Append(""),加入文字時,不會自動捲到最底下(TMemo 可以),對於只是當作log的顯示需求,很不方便,以下介紹克服的方法

在OnChange event裡,增加一個handler,加入程式碼如下

void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{
 SendMessage(RichEdit1->Handle,WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);  //自動換行作業
}

2008年12月19日 星期五

內存屏障(memory barrier)

memory barrier 長這樣 __asm__ __volatile__("": : :"memory")

首先gcc對於匯編語言(組合語言),是使用AT&T的語法,不同於INTEL的組合語言語法

格式 : __asm__(組合語言:輸出:輸入:修飾詞")
__volatile__     代表這行指令(這些組合語言),不和前面的指令一起最佳化
"memory"        告訴GCC這些組合語言會改變所有的RAM的資料
因為沒組合語言,又告訴gcc所有RAM的內容都改變,
所以這個memory barrier的效用,
會讓這行之前被gcc所cache到暫存器的資料通通寫回RAM裡面
也告訴gcc會讓之後讀取RAM的資料,必須再從RAM裡讀取出來,

參考資料:

http://blog.chinaunix.net/u1/55599/showart_1099203.html
http://hi.baidu.com/hilyjiang/blog/item/2254e62afd6db42cd42af180.html
http://lyowu.yourblog.org/logs/135030.html
http://blog.openrays.org/blog.php?do=showone&tid=329  
http://fanqiang.chinaunix.net/a4/b8/20010704/130401784_b.html

Qt - QLineEdit and focusInEvent

需求:想要客制化一個QLineEdit,希望在點選這個widget時,其text裡的內容全部反白(selectAll 的動作),

第一個想到clicked()這個signal,不過沒有...


然後試試 focusInEvent 的 virtual function,大概如下:

void HexEdit::focusInEvent(QFocusEvent * event)
{
    QLineEdit::focusInEvent(event);
    selectAll();    
}

結果還是不行,因為雖然有反白全部的內容,但在處理完focusInEvent後,應該會再處理mouse的event,所以等於在已經反白內容的QLineEdit上,點選,所以結果是沒有反白


最後試試bool eventFilter( QObject *target, QEvent *event ) 這個virtual function,加上installEventFilter(QObject *filterObj) 這個function,來抓 MouseButtonRelease 或 MouseButtonPress  的event,成功

HexEdit::HexEdit()
{
    installEventFilter( this );    
}

bool HexEdit::eventFilter( QObject *target, QEvent *event )
{
    if( event->type() == QEvent::MouseButtonRelease)
    {
        selectAll();
        return true;
    }
    return false;
}

過程中發現,其實用tab來切換focus到QLineEdit,其內容就會全部反白

Qt版本 4.4.3
相關資料
http://lists.trolltech.com/qt-interest/2004-07/thread01290-0.html
http://lists.trolltech.com/qt-interest/2007-01/thread00657-0.html