qtftp暫停恢復
A. 安裝QT環境遇到這種情況怎麼破
Centos6.3自身是帶QT4.6.2的,在裝系統時可以選擇安裝,但是沒有qvfb工具,所以又自己重新編譯了qt-x11的4.5.0版本。
qt各版本版本下載地址(在網上找的很多博文里給的鏈接都失效了,下面這個鏈接貌似還比較新,現在可以用):
http://qt-project.org/downloads
ftp://ftp.qt-project.org/qt/source/
在ftp資源里找到 qt-x11-opensource-src-4.5.0、qt-embedded-linux-opensource-src-4.5.0這兩個源碼包並下載(tar.gz或tar.bz2包都有,網速不好的話看哪個小下載哪個)。
下載後將兩個源碼包分別解壓,qt-x11-opensource-src-4.5.0解壓一份,qt-embedded-linux- opensource-src-4.5.0解壓兩份,分別命名為qt-embedded-linux-opensource-src-4.5.0-x86 和 qt-embedded-linux-opensource-src-4.5.0-arm 。
開始編譯安裝:
一、X11編譯:
1.進入qt-x11-opensource-src-4.5.0源碼目錄。
./configure -no-openssl
在我這里必須加上-no-openssl選項,否則在make過程中,編譯到ssl時會報錯。出錯信息為:
ssl/qsslsocket_openssl_symbols_p.h:264: error: variable or field 『q_sk_free』 declared void
ssl/qsslsocket_openssl_symbols_p.h:264: error: 『STACK』 was not declared in this scope
ssl/qsslsocket_openssl_symbols_p.h:264: error: 『a』 was not declared in this scope
ssl/qsslsocket_openssl_symbols_p.h:265: error: 『STACK』 was not declared in this scope
ssl/qsslsocket_openssl_symbols_p.h:265: error: 『a』 was not declared in this scope
……
……
默認安裝路徑為 /usr/local/Trolltech/Qt-4.5.0。可用--prefix 指定其他安裝路徑。
2. gmake # linux下一般可直接用make代替gmake。如果要加快編譯速度,就加上 -jx ,x表示最大的線程數。
3. gmake install
二、qt-embedded-x86編譯:
1.進入qt-embedded-linux-opensource-src-4.5.0-x86源碼目錄。
./configure -prefix /usr/local/Trolltech/QtEmbedded-4.5.0-x86 -embedded x86 -no-openssl -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
先後配置了安裝目錄、嵌入式架構(x86)。同時也跟X11版本一樣,配置了 -no-openssl,沒有這一項的話,make的過程中會出現跟編譯X11時一樣的錯誤。再後面的幾項是為了更好的配合qvfb,網上說如果沒有這幾 項,安裝好qt-embedded-x86後想在qvfb上調試程序時,會出現類似下面的錯誤:
Error opening buffer device /dev/fb0QScreenLinuxFb::connect: No such file or directory
2. gmake
跟x11版一樣
3. gamke install
三、qt-embedded-arm:
與前面兩個不同,在編譯arm版本的qt-embedded前,必須確認已經安裝了交叉工具鏈,編譯過程中要生成許多arm架構的庫,所以必須有 arm-linux-gcc、arm-linux-g++等工具。我用的是友善提供的arm-linux-gcc-4.5.1版本。
1. 進入qt-embedded-linux-opensource-src-4.5.0-arm源碼目錄。
./configure -prefix /usr/local/Trolltech/QtEmbedded-4.5.0-arm -embedded arm -no-openssl -qt-libpng
指定了安裝路徑、嵌入式架構。同時也跟X11版本一樣,配置了 -no-openssl,沒有這一項的話,make的過程中會出現跟編譯X11時一樣的錯誤。
另外,還增加了一項, -qt-libpng,這個選項應該是關於png相關的庫,指定用qt自帶的png庫。如果沒有這一項,我這里會出現如下錯誤:
image/qpnghandler.cpp: In member function 'virtual QVariant QPngHandler::option(QImageIOHandler::ImageOption) const':
image/qpnghandler.cpp:950:35: warning: 'png_info_struct::width' is deprecated (declared at /opt/FriendlyARM/toolschain/4.5.1/lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/png.h:639)
image/qpnghandler.cpp:950:35: warning: 'png_info_struct::width' is deprecated (declared at /opt/FriendlyARM/toolschain/4.5.1/lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/png.h:639)
image/qpnghandler.cpp:950:55: warning: 'png_info_struct::height' is deprecated (declared at /opt/FriendlyARM/toolschain/4.5.1/lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/png.h:640)
image/qpnghandler.cpp:950:55: warning: 'png_info_struct::height' is deprecated (declared at /opt/FriendlyARM/toolschain/4.5.1/lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/png.h:640)
make[1]: *** [.obj/release-shared-emb-arm/qpnghandler.o] 錯誤 1
make[1]: *** 正在等待未完成的任務....
make[1]: Leaving directory `/root/qt4.5.0/qt-embedded-linux-opensource-src-4.5.0-arm/src/gui'
make: *** [sub-gui-make_default-ordered] 錯誤 2
看起來像是我的交叉工具鏈跟這個QT版本匹配的不太好,Qt好像不太兼容交叉工具鏈的png.h頭文件中定義的數據結構。加上 -qt-libpng 可解決此問題。
四、qvfb:
這時QT就已安裝成功。但是還需要額外安裝qvfb。
進入qt-x11-opensource-src-4.5.0源碼包目錄,然後
cd tools/qvfb
在qvfb源碼目錄下運行 make 會在qt-x11-opensource-src-4.5.0/bin下生成qvfb,我們將它至/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin下即可。
end:
到這里,QT的開發環境基本就搭建好了,利用 qt-embedded-x86 和 qvfb 工具可以很方便的調試QT程序,調試好的程序再經 qt-embedded-arm 編譯就可在開發板上運行(還有個小問題,我現在編譯好的QT程序雖然可以在開發板上運行,但是運行時觸摸屏不能用,只能用USB滑鼠控制,想支持觸摸屏貌 似還需要移植tslib庫,等我折騰完了再回來把相關內容補充上)。
B. 在Qt中利用http下載時,如何實現暫停和續傳功能
reply.readall()
reply.read(...);
下載的時候每次記錄下載到哪兒
C. Qt中如何用按鈕來控制for循環,使其暫停、繼續
可以用信號機制來完成,按鈕負責給相應的進程發信號,而進程中的信號處理函數負責處理信號,遇到「暫停」信號就使進程sleep,遇到「繼續」信號,就喚醒進程。
D. 用Qt Phonon開發音樂播放器,怎麼讓其暫停後重新開始播放的時候從暫停的地方開始播放
pause()暫停方法,暫停的時候是記住了當前位置的 然後直接play()應該就是從剛才停止的地方直接開始啊 不會從頭來的吧
E. 請教Qt5下qtftp的編譯問題
1. 確保PATH環境變數設置正確。 2. 1正確的話,試著執行一下C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat文件 詳細看這里:http://social.msdn.microsoft.com/Forums/en-US/vssetup/thread/3312be98-cf2b-4907-af89-d..
F. 如何用Qt寫一個同一時間只能運行一個實例的應用程序
為了使一個應用程序在同一時間只運行一個實例,需要用某種方法在程序啟動時,檢測是否已有正在運行的實例,如果有,則將本次啟動的參數傳遞給前一個實例(例如需要打開的文檔的路徑),如果沒有,則正常啟動。
實現的方法有多種:
1. 用Windows API創建一個互斥量:
#include <windows.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HANDLE hMutex = CreateMutex(NULL, TRUE, L"YourApp"); // 創建一個互斥量來保證只運行一個實例
if(hMutex != NULL)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
QMessageBox::critical(qApp->activeWindow(), QObject::tr("An instance of this application has been run!"), QObject::tr("Only one instance can be run at a time!"));
return 1;
}
}
... // 以下是正常啟動代碼
}
註:如果保險起見,CreateMutex()中的字元串應該用一個GUID來保證其唯一性,Visual Studio中有一個生成GUID的工具,菜單「工具」->「創建GUID」,選擇合適的定義形式,創建並拷貝到剪貼板即可。
此方法的缺點:1.使用了Windows API,不能跨平台;2.不能自動激活前一個實例的窗口。
2. 每次啟動時用Windows API枚舉進程,同時在第一次運行時用SetProp()函數給當前窗口設置屬性,這樣下次啟動時,在枚舉的進程中查找具有這個屬性的窗口,若找到,說明已有實例在運行,將該實例的窗口激活;若未找到則正常啟動。
此方法客服了前一方法的第2個缺點,但過於依賴Windows API函數(似乎還是MFC函數,對Qt程序好像不可行)。有興趣的可以照這個鏈接里的代碼試試
3. 利用QLocalSocket和QLocalServer,基本的思路是:
應用程序啟動時首先嘗試去連接一個QLocalServer,如果連接失敗,說明自己是第一個實例,於是創建這么一個QLocalServer,否則將啟動參數發送給QLocalServer然後退出。第一個實例的QLocalServer在收到後面啟動的實例發來的參數時可以進行處理(例如激活第一個實例的窗口)。這個鏈接里有詳細的示例代碼供參考。
註:使用QLocalSocket和QLocalServer時,需要把QtNetwork庫包含在項目文件中;
4. 用Qt Solutions里提供的QtSingleApplication類(最簡單的方法,推薦)
從ftp://ftp.qt.nokia.com/qt/solutions/lgpl/ 下載QtSingleApplication的源碼包,解壓縮後按照INSTALL.TXT里的說明進行配置和編譯,我選擇編譯成動態庫,這樣下次再用,只需引用頭文件和lib文件即可,比較方便。
用法很簡單,只需把原來main()里的QApplication對象換成QtSingleApplication對象,調用一下isRunning()方法進行判斷即可。
// 原來的代碼
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyMainWidget mmw;
mmw.show();
return app.exec();
}
// 修改後的代碼
int main(int argc, char **argv)
{
QtSingleApplication app(argc, argv);
if (app.isRunning())
return 0;
MyMainWidget mmw;
mmw.show();
return app.exec();
}
注1:QtSingleApplication的實現方法基本上也是利用QLocalServer和QLocalSocket,所以同樣依賴於QtNetwork庫;
注2:以上代碼只展示了QtSingleApplication最簡單的用法,這個類還有更多用法,請參考源碼包中帶的範例和文檔。
QtSingleApplication的幾種用法(直接使用源碼,編譯成動態庫等)可以參考這個鏈接:Qt程序只運行一個實例
G. qt中連接到ftp伺服器上後怎麼獲取服務下所有的文件名
操作方法如下:
@echo off
set h=192.168.1.100
set u=ftpuser
set p=12345678
echo open %h%>ftp.txt
echo %u%>>ftp.txt
echo %p%>>ftp.txt
echo dir>>ftp.txt
echo bye>>ftp.txt
ftp -s:ftp.txt>ftpdir.txt
echo open %h%>ftp.txt
echo %u%>>ftp.txt
echo %p%>>ftp.txt
for /f "tokens=4" %%i in ('findstr "<DIR>" ftpdir.txt') do (
echo cd %%~i>>ftp.txt
echo dir>>ftp.txt
echo cd ..>>ftp.txt)
echo bye>>ftp.txt
ftp -s:ftp.txt>ftpfile.txt
notepad ftpfile.txt
H. qt調用ftp cmd
qt調用ftpcmd的方法如下。
QProcess::start()接受兩個參數。
第一個是要執行的命令或者程序,這里就是notepad.exe。
第二個是一個QStringList類型的數據,也就是需要傳遞給這個程序的運行參數。注意,這個程序是需要能夠由系統找到的,一般是完全路徑。
QtCreator是一個用於Qt開發的輕量級跨平台集成開發環境。QtCreator可帶來兩大關鍵益處:提供首個專為支持跨平台開發而設計的集成開發環境(IDE),並確保首次接觸Qt框架的開發人員能迅速上手和操作。即使不開發Qt應用程序,QtCreator也是一個簡單易用且功能強大的IDE。