Qt學習筆記:2018年8月記錄
1. Qt 設定背景圖片注意事項:
使用stylesheet設定背景圖片還是有一些要注意的,如果是在mainwindow和dialog中,
直接右鍵change style sheet在add resource中選擇background-image或者border-image,
選擇資原始檔中的圖片就行了(前者是按畫素顯示圖片,後者可根據窗體大小來自動縮放圖片),
但在widget中就不行,你會發現,用同樣的方法,背景並沒有發生改變,而僅僅是它的子窗體背景圖片發生了改變。
那麼在widget中要如何做呢,我們在widget中放置一個frame,然後對frame通過stylesheet設定背景,後面窗體裡所有的部件都放在這個frame裡。
子窗體會繼承父窗體的屬性,也就是說,父窗體的背景,在子窗體中也會有,
那如何讓子窗體不繼承父窗體的背景呢,同樣的,還是在Edit Style Sheet裡,需下輸入如下程式碼:
QFrame *frame = new QFrame;
frame->setObjectName("myframe");//1
frame->resize(400,700);
frame->setStyleSheet("QFrame#myframe{border-image:url(images/frame.png)}" );//2
frame->show();
2. 自定義右鍵選單:
1.widget物件設定 setContextMenuPolicy(Qt::CustomContextMenu)
2.建立一個QMenu物件, 指定好父類指標
3.關聯widget的 customContextMenuRequested(QPoint) 訊號到自定義的槽
connect(ui->tbvFileLog,SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(FileLogTbvPopupMenu(QPoint)));
4.在槽函式裡面執行Qmenu物件的exec方法
exec(QCursor::pos());
補充: QMenu選單新增選單項:
QMenu物件呼叫addAction方法, 通過訊號槽關聯這個QAction的點選事件
3. QT 焦點事件
設定焦點可以讓應用更便捷。比如當你開啟百度主頁或其他帶有編輯框的頁面時,不需要先用滑鼠點選編輯框就可以直接輸入文字等資訊到其中。
這就是由於搜尋框設定了焦點。
一個控制元件要先設定它焦點事件的模式,即視窗如何接受焦點事件(通過滑鼠單擊、Tab鍵、不接受焦點事件等)
void setFocusPolicy ( Qt::FocusPolicy policy )
當前有焦點事件的視窗只能有一個,當一個視窗獲取焦點事件或失去焦點事件時,可能需要相應的操作,或者如何判斷一個才視窗有沒有焦點事件。Qt中亦有相應的函式。
void QWidget::focusInEvent ( QFocusEvent * event ) [virtual protected]
void QWidget::focusOutEvent ( QFocusEvent * event ) [virtual protected]
這兩個就是視窗獲取或失去焦點事件的函式,需要我們重寫(好多視窗都是從QWidget繼承這兩個函式的)
bool hasFocus () const
這個函式就是判斷當前視窗有沒有焦點事件的,返回布林值。
void QWidget::setFocus ( Qt::FocusReason reason )
void QWidget::clearFocus ()
這兩個函式就是設定或清除焦點事件的。
4. paintEvent ()使用和觸發
當發生一下情況時會產生繪製事件並呼叫paintEvent()函式:
- 在視窗部件第一次顯示時,系統會自動產生一個繪圖事件,從而強制繪製這個視窗部件。
- 當重新調整視窗部件的大小時,系統也會產生一個繪製事件。
- 當視窗部件被其他視窗部件遮擋,然後又再次顯示出來的時候,就會對那些隱藏的區域產生一個繪製事件。
- 呼叫QWidget::update()或者QWidget::repaint()來強制產生一個繪製事件。二者的區別是:
repaint()函式會強制產生一個即時的重繪事件,
而update()函式只是在Qt下一次處理事件時才呼叫一次繪製事件。
如果多次呼叫update(),Qt會把連續多次的繪製事件壓縮成一個單一的繪製事件,這樣可避免閃爍現象。
5. installEventFilter 安裝事件過濾器
void QObject::installEventFilter(QObject *filterObj);
filterObj引數表示要在其上實現事件過濾器函式的部件(widget)。
請注意,如果我們在一個部件安裝了事件過濾器,一般在其父控制元件上實現事件過濾器函式。
給QObject物件安裝事件過濾器:物件呼叫installEventFilter()後,所有到達目標控制元件的事件都首先到達監視物件的eventFilter()函式。
如果一個物件有多個事件過濾器,過濾器按順序啟用,先到達最近安裝的監視物件,最後到達最先安裝的監視物件。
eg:
monitoredObj-> installEventFilter(filterObj);
事件過濾器是一個接收發送到此物件的所有事件的物件。過濾器可以停止事件或將其轉發到此物件。
事件過濾器filterObj通過其eventFilter()函式接收事件。
如果事件要過濾(或停止),eventFilter()函式必須返回true; 否則必須返回false。
如果在單個物件上安裝了多個事件過濾器,則首先啟用最後安裝的過濾器。
6. 自定義QPushButton控制元件,重寫滑鼠事件後不發出clicked()訊號。
自定義Button控制元件繼承自QPushbutton,然後重寫滑鼠事件mousePressEvent。會發現在父類中呼叫該自定義的button,沒有發出clicked()訊號。
原因是:當重寫完成以後,需要在每個事件中新增:
//保留原有QPushButton的點選事件
void QPushButton::mousePressEvent(e);
eg:
//重寫滑鼠釋放事件
void myButton::mouseReleaseEvent(QMouseEvent*e)
{
if(e->button()==Qt::RightButton)
{
m_menu.exec(QCursor::pos());//右鍵顯示選單
}
//保留原有QPushButton點選事件
QPushButton::mouseReleaseEvent(e);//不新增該句會造成不釋放clicked()訊號。
}
7. 不改變ui ,移除QTabWidget中的一些tab不顯示。
QTabWdiget中,需要不改變ui.通過程式碼移除一些tab不顯示。
則可以通過:
先移除整張TabWidget 然後在新增需要顯示的某一頁。
ui->m_tabWidget->clear();
ui->m_tabWidget->addTab(ui->tab_7,"顯示的tab");
8. QListWidget的item設定成只識別滑鼠左鍵點選.
在QListWidget的使用中,不管是滑鼠左鍵還是右鍵點選item項,都回響應 itemClicked()訊號。
而有時候我們需要的是,只有滑鼠左鍵才會選中item 右鍵不響應,
我們可以通過繼承QListWidget類,重寫:
void MyListWidget::mousePressEvent(QMouseEvent *e)
{
//只有在滑鼠左鍵按下的時候,才會保留原有的點選事件
if(e->button()==Qt::LeftButton)
{
emit clicked(index);
//要繼續保留QListWidget原有的點選事件.
QListWidget::mousePressEvent(e);//
}
}