close
記下工作遇到的困難點
暫時不特別整理,直接從記事本貼上來
標題過於簡潔~可能對於要搜尋的人沒啥用...

使用QT4.6/4.7 @windows XP

/*As Sleep*/
QTime dieTime = QTime::currentTime().addMSecs(5000);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);


/*Resource File @ QtCreator*/
Add res file -> Add prefis ->/new/prefix1 改成 /
使用res:QIcon(":/file.png")
不使用res:QIcon("file.png") <-要放在和exe同個資料夾


/*Qthread & QProgressBar using signal& slot*/
http://www.qtforum.org/article/29278/thread-updates-progress-bar.html
1.在Thread的constrctor建立conncet(this,signal,progress所在class,setvalue)
2.在run()emit signal
3.原因...似乎是只能在main thread改變GUI ?

/*connect的順序*/
一個signal對多個slot時,寫在前面的slot會先執行(不一定)

/*EXE檔*/
http://qt.csdn.net/articles.aspx?pointid=447&pointid2=
動態:找dll檔
靜態:用qt mingw bulid

/*QMessageBox*/
不需要有close button時,(沒有add close standard button時),右上的"X"會disable.
方法: 加入standard button,然後把那個QPushButoon hide().

/*TableWidgetItem設定border時,selection-background-color無效*/
http://bugreports.qt.nokia.com/browse/QTBUG-11024?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs
方法: ::item{border:xxxx} ::item:selected{background:xxxx}
p.s TableWidgetItem設定border時,itme的background-color也無效(有點忘了)

/*TableWidgetItem的empty cell讓它不能select*/
把TableWidget設為No selection,利用cellClicked去setCurrentItem(row,column,select)
缺點是selectAll需要自己implement

/*Layout*/
整個UI的layout設定(Designer):在最外層(QMainWindow)按右鍵選Layout設定

/*File readline*/
方法1. QByteArray = QFile::readline()
方法2. QTextStream(file)
QString = QTextStream::readline()
差別: QFile的readline有"\n", QTextStream的沒有

As usual. The Qt programing is an hour of reading the docs and a line of code

/*QMap & QList*/
QMap > penList;
↑前後要留空白,編譯才會過

/*Application Version*/
http://www.openguru.com/2009/11/qt-best-way-to-set-application-version.html
1. QString applicationVersion()
void setApplicationVersion(const QString & version)
2. pro file加上 (qmake會自動產生.rc檔)
VERSION = 1.0.0
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
(Note: \\\" is important! Without them, the Macro is taken as a double
constant instead of string constant.)
3. QApplication app(argc, argv); // Setting the Application version
app.setApplicationVersion(APP_VERSION);
如此程式可以可以拿APP_VERSION來設windowTitle之類
4.詳細檔案資訊
在pro檔裡加上RC_FILE = xx.rc (自訂rc檔) 但似乎只能用在windows上

/*Table 不能收到mouse event*/
因為QTableWidget繼承了QScrollArea,在這裡把mouseevnt檔掉了
然後繼承後重寫mouseEvent
/*Table 找滑鼠右鍵clicked*/
同上,或找他的viewport->installEventFilter(),寫evnetFilter
http://lists.trolltech.com/qt-interest/2008-09/msg00225.html
http://permalink.gmane.org/gmane.comp.lib.qt.general/36856
結論:在同一個class要分辨itemClicked是右鍵或左鍵是不可能的

/*set radiobutton checked*/
setAutoExclusive(false)
setChecked(true)
setAutoExclusive(true)

/*warning message*/
在mac中,有變數未使用會產生warning message (function的parameter?),無法關閉
為了統一所以在windows下的參數打開,然後在source file關閉
在pro檔加入:
# In Mac environment, the following compiler warning option is always opened
# pragma is required to close it. For early check for this problem by Windows
# developer, this option is always applied.
QMAKE_CXXFLAGS += -Wunused-parameter
在source檔加入:
#pragma GCC diagnostic ignored "-Wunused-parameter"

/*一次執行一個程式(QT中???用程序的?例化)*/
1. 利用QtSingleApplication (為QtSolution早期於qt商業版,現在在LGPL規範中,qt也不再開發)
2. 利用QSharedMemory檢查
3. 利用QLocalSocker/QLocalServer檢查
4. 在client-server情形時,檢查QProcess的狀態
http://dev.firnow.com/course/3_program/c++/cppxl/20100531/206675.html
http://blog.csdn.net/feilinhe/archive/2010/04/22/5517637.aspx
http://doc.qt.nokia.com/solutions/4/qtsingleapplication/qtsingleapplication.html
http://blog.csdn.net/seven407/archive/2010/08/13/5809222.aspx

/*QDataStream與QLocalSocket*/
情況: 傳送socket時,讀取到錯的資料,且發送端write一次,收到兩次readyRead,造成兩次輸出
觀察: 發送端送出某個長度的data,接收端收到但沒有收完
server:
out << data1;
out << data2;
client:
in >> data1;

client在第一次的收data會對,但第二次會錯!
猜測原因:
因為第一次沒收完,後面的data會保留,留到下次,接連第二次的data一起,
以產生了兩次readyRead
解決: 送多少data,讀多少data 或 不要送不必要的data.
(也許有正規的解決方法?)

/*QLocalSocket::waitForReadyRead() & bytesAvailable()*/
QLocalSocket傳送與TCP類似,所以只要socket寫入了data,就算readyread的情況,所以
waitForReadyRead就會傳回true,並不是等他整筆data傳完.
使用blocking時(在同個function write socket等server回傳再read),可先檢查第一筆
data(全部data size)是否寫入,讀出size後,再等到所有data都readyRead才讀.

須注意readyRead的signal仍可能發出(我目前先在write前diconnect signal,read後
再connect)

如果是non-blocking的情況時(用readyRead 做signal/slot),readyRead似乎會等資料寫完才emit

結論是最好同一個socket有同樣的運作,都使用readyRead溝通or都使用bytesAvailable處理

/*QLocalSocket::waitForConnected()*/
好像無用...
*QT在tcp和localSocket這似乎有不少bug..有的會在4.8更正...


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 natsumi93 的頭像
    natsumi93

    Alpha Planet

    natsumi93 發表在 痞客邦 留言(0) 人氣()