順豐科技QT面試題

完整的文章發佈在公衆號,可以關注公衆號查看完整文章,關注公衆號“程序猿小哥”,請掃描下面的二維碼。

 

自定義控件:

應該做過吧?能舉幾個例子嗎?還有其他的嗎?

你覺得自定義控件的方法主要是哪些?

答:從外觀設計上:QSS、繼承繪製函數重繪、繼承QStyle相關類重繪、組合拼裝等等

從功能行爲上:重寫事件函數、添加或者修改信號和槽等等

QSS:

QSS平時使用的多嗎?能舉幾個例子嗎?

都是如何使用,能說說嗎?

答:1.將QSS統一寫在一個文件中,通過程序給主窗口加載;

2.寫成一個字符串中,通過程序給主窗口加載;

3.需要使用的地方,寫一個字符串,加載給對象;

4.QT Designer中填寫;

事件機制:

QT程序是事件驅動的,事件到處都可以遇到。能說說平時經常使用到哪些事件嗎?

常見的QT事件類型如下:

    鍵盤事件: 按鍵按下和鬆開     鼠標事件: 鼠標移動,鼠標按鍵的按下和鬆開

    拖放事件: 用鼠標進行拖放     滾輪事件: 鼠標滾輪滾動

    繪屏事件: 重繪屏幕的某些部分    定時事件: 定時器到時

    焦點事件: 鍵盤焦點移動   進入和離開事件: 鼠標移入widget之內,或是移出

    移動事件: widget的位置改變    大小改變事件: widget的大小改變

    顯示和隱藏事件: widget顯示和隱藏    窗口事件: 窗口是否爲當前窗口

知道QT事件機制有幾種級別的事件過濾嗎?能大致描述下嗎?

答:根據對Qt事件機制的分析, 我們可以得到5種級別的事件過濾,處理辦法. 以功能從弱到強, 排列如下:

1)重載特定事件處理函數.

最常見的事件處理辦法就是重載象mousePressEvent(), keyPressEvent(), paintEvent() 這樣的特定事件處理函數.

2)重載event()函數.

通過重載event()函數,我們可以在事件被特定的事件處理函數處理之前(象keyPressEvent())處理它. 比如, 當我們想改變tab鍵的默認動作時,一般要重載這個函數. 在處理一些不常見的事件(比如:LayoutDirectionChange)時,evnet()也很有用,因爲這些函數沒有相應的特定事件處理函數. 當我們重載event()函數時, 需要調用父類的event()函數來處理我們不需要處理或是不清楚如何處理的事件.

3) 在Qt對象上安裝事件過濾器.

安裝事件過濾器有兩個步驟: (假設要用A來監視過濾B的事件)

首先調用B的installEventFilter( const QOject *obj ), 以A的指針作爲參數. 這樣所有發往B的事件都將先由A的eventFilter()處理.

然後, A要重載QObject::eventFilter()函數, 在eventFilter() 中書寫對事件進行處理的代碼.

4) 給QAppliction對象安裝事件過濾器.

一旦我們給qApp(每個程序中唯一的QApplication對象)裝上過濾器,那麼所有的事件在發往任何其他的過濾器時,都要先經過當前這個 eventFilter(). 在debug的時候,這個辦法就非常有用, 也常常被用來處理失效了的widget的鼠標事件,通常這些事件會被QApplication::notify()丟掉. ( 在QApplication::notify() 中, 是先調用qApp的過濾器, 再對事件進行分析, 以決定是否合併或丟棄)

5) 繼承QApplication類,並重載notify()函數.

Qt 是用QApplication::notify()函數來分發事件的.想要在任何事件過濾器查看任何事件之前先得到這些事件,重載這個函數是唯一的辦法. 通常來說事件過濾器更好用一些, 因爲不需要去繼承QApplication類. 而且可以給QApplication對象安裝任意個數的事件。

文章鏈接:https://mp.weixin.qq.com/s/2z9bqc9ebcwv-Il9aMNO7g

完整的文章發佈在公衆號,可以關注公衆號查看完整文章,關注公衆號“程序猿小哥”,請掃描下面的二維碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章