1. 程式人生 > >Qt學習筆記:2018年8月記錄

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()函式:

  1. 在視窗部件第一次顯示時,系統會自動產生一個繪圖事件,從而強制繪製這個視窗部件。
  2. 當重新調整視窗部件的大小時,系統也會產生一個繪製事件。
  3. 當視窗部件被其他視窗部件遮擋,然後又再次顯示出來的時候,就會對那些隱藏的區域產生一個繪製事件。
  4. 呼叫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);//
        }
}