Qt專案中遇到的一些 小問題彙總

2021-06-17 15:43:51 字數 4334 閱讀 7974

公司讓負責qt介面開發,但是接觸qt又不久,現將在專案中遇到的一些問題彙總下,一為了避免自己忘記,二希望能幫助到他人。

1.在程式關閉視窗時,顯示提示視窗:

qt中有很多訊號和相應的槽函式,上述問題需要攔截關閉視窗資訊qwidget::close(),qwidget::closeevent( qcloseevent * event )重寫,即對**如下:

[cpp]view plain

copy

print?

"font-family: simsun; font-size: 13px;">void qwidget::closeevent ( qcloseevent * event ) 

else

if(button == qmessagebox::yes)    }

void qwidget::closeevent ( qcloseevent * event )

else if(button == qmessagebox::yes)

}

2.在程式中開闢執行緒,需要在程式結束前結束執行緒,如果在程式中動態開闢了記憶體,需要考慮記憶體釋放問題:

(1).開啟執行緒, 如果程式中需要使用執行緒,可以通過自定義執行緒,繼承qthread,重寫qthread::run(),run()函式體內就是執行緒的執行過程,記得在函式最後加上事件迴圈qthread::exec(),再通過qthread::start()函式開啟執行緒。

(2).結束執行緒,先呼叫qthread::exit(),結束執行緒事件迴圈,再呼叫qthread::wait()來阻塞主程式知道執行緒結束執行。

補充: qt中當parent銷毀時,會自動delete child物件,而對於沒有parent的物件需要手動釋放。

3.訊號和槽問題:

(1).訊號是某個物件的訊號,槽也是某個物件的槽,訊號和槽通過qobject::connect()聯絡在一起,這個聯絡可以再很多地方都可建立,只要確定

再呼叫qobject::connect()函式前,該訊號和槽的物件已經存在。

(2).多執行緒間的通訊,也可以通過訊號和槽來實現。

4.qt可執行程式在他人電腦上執行顯示亂碼問題:

qt目錄plugins下的codecs資料夾下的內容是跟文字顯示有關,如果沒有這個,可能會出現中文亂碼等等一些問題,解決方法如下:

a. 在主程式main開始處增加以下語句,注意要按順序書寫:

b.程式其他地方,包括其他檔案、類檔案中,直接使用中文,建議還是用tr("中文形式"):

qstring str = tr("我是中文");

lbl1.settext(str);

lbl2.settext("你好,中文!");

c.在部署目錄(執行程式放置的目錄)中建立子目錄 plugins,之後在此目錄中建立codecs子目錄,將qcncodecs4.dll複製到此子目錄中(根據程式需要,有可能是codecs下的其他檔案),形成如下目錄結構:

d.大功告成!試試你的程式吧,漂亮的中文出現了!

其實plugins中還可以放置程式中使用的其他外掛程式,如sql和影象處理外掛程式(到qt安裝目錄下的qt\plugins下按目錄結構複製你所需要檔案的即可)。

5.qt載入檔案,及工程工作目錄與可執行檔案目錄的區別:

對於較大的程式,程式中可能會呼叫很多其它工程的dll或者需載入資訊,習慣上將可執行程式單獨放在乙個目錄下。

工作目錄:一般情況下是指程式工程目錄,而不是可執行程式所在目錄(一般在工程目錄中的debug目錄下)。

有的時候可執行程式需要脫離工程目錄,如將程式放在其它電腦上執行時,以下是將工作目錄設定成可執行程式目錄的**:

(1). qt獲得當前可執行程式目錄:qdir::currentpath();

(2).修改工作目錄:bool qdir::setcurrent( const qstring &path ) [static];

[cpp]view plain

copy

print?

qdir::setcurrent(dir);

qdir::setcurrent(dir);

6.vs2010無法設定斷點問題:

the breakpoint will not currently be hit.

從選單欄的 tools->options->debugging->general 

取消  "require source to exactly match..." 項的選擇。

還有兩個可能是

1.  開啟專案屬性,選擇除錯選項卡,將「啟用非託管**除錯」一項鉤上。

2. 由於terminal services 這個服務被禁用了,將這個服務設為自動,將這個服務啟動。

以上**:

對於單個斷點,可以右鍵—>location—>勾選「allow source code to be defferent」

7.qt主程式介面退出時,想要使程式退出:

一般情況下,當程式有多個視窗時,如果沒有關閉所有視窗,程式並不會終止,這是因為在視窗被建立時,預設將視窗的屬性設定為qwidget::setattribute( qt::wa_quitonclose,true),即表示程式退出的條件是設定這個屬性為true的所有視窗都退出。

8.qt+vs2010程式在其他為安裝vs2010環境的計算機上無法執行解決方案:

通過depends工具查詢程式依賴的dll,正常情況下,對於沒有安裝vs2010環境的計算機想要執行該程式,需要載入msvcp100.dll、msvcr100.dll、msvcp100d.dll、msvcr100d.dll,這幾個dll中100表示2010版。

9.qmainwindow控制項中心控制項自動新增滾動條,及對視窗標題欄上的最大、最小、關閉按鈕的設定:

[cpp]view plain

copy

print?

qtextedit *edit = new qtextedit; 

edit->settext(tr("hello world")); 

edit->setgeometry(5,5,1000,800);  

qscrollarea *area = new qscrollarea; 

setcentralwidget(area); 

area->setwidget(edit);//只是中心部分,其餘自己自己補充

qtextedit *edit = new qtextedit;

edit->settext(tr("hello world"));

edit->setgeometry(5,5,1000,800);

qscrollarea *area = new qscrollarea;

setcentralwidget(area);

area->setwidget(edit);//只是中心部分,其餘自己自己補充

按鈕設定:

setwindowflags ( qt::windowflags type )

qt::framewindowhint:沒有邊框的視窗

qt::windowstaysontophint://總在最上面的視窗

qt::customizewindowhint://自定義視窗標題欄,以下標誌必須與這個標誌一起使用才有效,否則視窗將有預設的標題欄

qt::windowtitlehint:顯示視窗標題欄

qt::windowsystemmenuhint://顯示系統選單

qt::windowminimizebuttonhint://顯示最小化按鈕

qt::windowmaximizebuttonhint://顯示最大化按鈕

qt::windowminmaxbuttonshint://顯示最小化按鈕和最大化按鈕

qt::windowclosebuttonhint://顯示關閉按鈕

10.設定視窗為模式對話方塊或者非模式對話方塊:

qwidget :: void setwindowmodality( qt::windowmodality

windowmodality

)11.當用自定義資訊引數為自定義結構體時,顯示error:

qobject::connect: cannot queue arguments of type 'mediadbattirbute' (make sure 'mediadbattirbute' is registered using qregistermetatype().)

解決方法:

qregistermetatype("mediadbattirbute");

Qt專案中遇到的一些小問題彙總

1.在程式關閉視窗時,顯示提示視窗 qt中有很多訊號和相應的槽函式,上述問題需要攔截關閉視窗資訊qwidget close qwidget closeevent qcloseevent event 重寫,即對 如下 cpp view plain copy font family simsun fon...

專案中遇到的一些小問題

question1.如何將bstr型別的字元轉換為小寫?bstr str 初始化 cstring tmp str str.makelower bstr t bstr tmp 這樣就可以了,bstr t只是對bstr的包裝而已,可以直接轉換 question2.如何獲取當前的登陸使用者名稱?wchar...

SpringMVC遇到的一些小問題

1 空指標 autowired private departmentdao departmentdao 出現該問題主要是忘記新增了 autowired註解 導致departmentdao未注入到employeedao中 從而出現departmentdao中的getdepartment id 方法不能...