文章目錄
- 1、Window Frame
- 2、windowTitle
- 3、windowIcon
- 4、qrc機制
- 5、windowOpacity
1、Window Frame
在運行Qt程序后,除了用戶做的界面,最上面還有一個框,這就是window frame框。對于界面的元素,它們的原點是Qt界面的左上角或window frame左上角。比如geometry(),setGeometry()是以界面左上角為原點,而frameGeometry()和setFrameGeometry()是以window frame左上角為原點的。
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QRect rect1 = this->geometry();QRect rect2 = this->frameGeometry();qDebug() << rect1;qDebug() << rect2;}
代碼在構造函數,那么如果運行直接就看,還在構造階段,還看不到兩個實際的區別。運用到對象上就看出來了。
// widget.h
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();private:Ui::Widget *ui;
};// widget.cpp
#include <QPushButton>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton(this);button->setText("按鈕");button->move(330, 250);connect(button, &QPushButton::clicked, this, &Widget::handle);
}void Widget::handle()
{QRect rect1 = this->geometry();QRect rect2 = this->frameGeometry();qDebug() << rect1;qDebug() << rect2;
}
2、windowTitle
只針對頂層窗口適用。修改窗口標題
拖一個按鈕到界面,改一下槽函數
void Widget::on_pushButton_clicked()
{this->setWindowTitle("窗口標題");
}
3、windowIcon
只針對頂層窗口適用。修改窗口圖標
QIcon就是一個圖標。設置圖標需要在本地存一個圖片,但是路徑不帶中文,并且不寫反斜杠\,會被當成轉義字符。要么/,要么\。也可以用C++11的raw string來解決,即r(),括號里直接寫原路徑即可,
#include <QIcon>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 不在堆創建, 因為不需要依靠對象樹來釋放以及保障生命周期, 況且QIcon也不支持對象樹// QIcon對象比較小, 設置到某個控件后它釋放與否不影響圖標顯示QIcon icon("E:\\pexels-ithalu-dominguez-907485.jpg");this->setWindowIcon(icon);
}
也可以用相對機制。
4、qrc機制
給Qt項目引入一個額外的xml文件,后綴名為.qrc,在這個xml中把圖片導入進去,并且在xml中記錄。Qt在編譯項目時,會根據qrc中描述的圖片信息,找到圖片內容,提取出圖片的二進制數據,并轉為C++代碼,最終編譯到exe中。最終代碼里可以看到很大的char數組,就是圖片的二進制數據。不過這樣肯定就不能往qrc里導入太大資源了。
新建一個.qrc的項目
會自動在resource后面加上.qrc。
創建完成后出現這個畫面:
把圖片導入到qrc文件中,下面有圖片顯示。
1、創建前綴,意思是創建一個虛擬目錄,為了Qt能夠方便地訪問到這個圖片。點擊Add Prefix:
2、導入圖片,圖片的路徑必須在此qrc文件的同級目錄或子目錄下,點擊Add Files,選擇文件即可
3、回到之前的項目,用qrc中的圖片來作為圖標
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 不在堆創建, 因為不需要依靠對象樹來釋放以及保障生命周期, 況且QIcon也不支持對象樹// QIcon對象比較小, 設置到某個控件后它釋放與否不影響圖標顯示//QIcon icon("E:\\pexels-ithalu-dominguez-907485.jpg");QIcon icon(":/pexels-ithalu-dominguez-907485.jpg");this->setWindowIcon(icon);
}
生成的實時文件中,會多出一個qrc_resource.cpp文件。qrc中導入的圖片資源,就會轉成這個文件。文件中每個二進制數字表示圖片中每個字節的數據。Qt項目編譯時,這個cpp文件被一起編譯到了exe中,當exe程序運行時,圖片的數據就加載到內存了。
5、windowOpacity
毛玻璃效果。
setWindowOpacity(float n)設置控件的不透明值。
拖兩個按鈕,一個加一個減
void Widget::on_pushButton_add_clicked()
{float opacity = this->windowOpacity();if(opacity >= 1.0) return;qDebug() << opacity;opacity += 0.1;this->setWindowOpacity(opacity);
}void Widget::on_pushButton_sub_clicked()
{float opacity = this->windowOpacity();if(opacity <= 0.0) return;qDebug() << opacity;opacity -= 0.1;this->setWindowOpacity(opacity);
}
不過我也可以不加if判定,因為超過1.0和小于0.0的浮點數,setWindowOpacity方法內部也有判定,這些數字不會被設定進去。不過為了好的編寫習慣,還是要寫上判斷。
結束。