❶ Qt中如何利用 png 圖片來實現自定義形狀的窗口
Qt 中 QWidget::setMask() 的用法 把QWidget 自定義成各種形狀,使用 png 透明圖片作為窗體顯示,效果如下
關鍵知識: Qt::WindowFlags 使窗口支持無邊框 [From Qt Doc:This enum type is used to specify various window-system properties for the widget. They are fairly unusual but necessary in a few cases. Some of these flags depend on whether the underlying window manager supports them.]。使用 Qt::WindowFlags 可以實現一些不同類型的窗口,如:用 Qt::FramelessWindowHint 來實現無邊框窗口,用 Qt::Popup 來實現彈出式的窗口,用 Qt::Tool 來實現工具窗口,用Qt::CustomizeWindowHint 來關閉窗口標題欄以及與 Qt::WindowCloseButton(添加關閉按鈕),Qt::WindowMaximumButtonSize(添加最大化按鈕)聯用來建立只有關閉按鈕和最大化按鈕的窗口,用 Qt::WindowStaysOnTopHint 使窗口永遠在最前端等。 Qt::WidgetAttribute 使窗口支持透明背景以及在關閉後主動銷毀。其它一些常用的 Attribute 有:Qt::WA_AcceptDrops 使 widget 支持拖拽操作,Qt::WA_MouseTracking 使 widget 及時響應滑鼠移動事件(MouseMoveEvent)。Qt::setMask() 函數對窗口進行部分區域遮掩來實現各種形狀的窗口。[From Qt Doc:Causes only the pixels of the widget for whichbitmap has a corresponding 1 bit to be visible. If the region includes pixels outside the rect() of the widget, window system controls in that area may or may not be visible, depending on the platform.]。Qt::ContextMenuPolicy 來配置窗口的右鍵菜單方案。[From Qt Doc:This enum type defines the various policies a widget can have with respect to showing a context menu.]。paintEvent() 回調函數來對窗口進行繪制。 重寫 mousePressEvent() 和mouseMoveEvent() 函數來實現窗口的拖拽移動(無邊框窗口沒有標題欄,默認拖拽窗體是沒法移動窗口的)。部分代碼解釋:頭文件: 1:#ifndef SHAPEDWIDGET_H 2:#define SHAPEDWIDGET_H 3: 4:#include <QWidget> 5:class QPoint; 6:class QPixmap; 7:class ShapedWidget : public QWidget 8: { 9: Q_OBJECT 10:public: 11:explicit ShapedWidget(QWidget *parent = 0); 12: ~ShapedWidget(); 13: 14:private slots: 15:void changeSkin(); 16: 17:protected: 18:void mousePressEvent(QMouseEvent *); 19:void mouseMoveEvent(QMouseEvent *); 20:void paintEvent(QPaintEvent *); 21: 22:private: 23:void initData(); 24:void initVisualComponents(); 25:void setupContextMenu(); 26: 27: QPoint* dragPos_; 28: QPixmap* backgroundPixmap_; 29: }; 30: 31:#endif // SHAPEDWIDGET_H構造: 1: ShapedWidget::ShapedWidget(QWidget *parent) : 2: QWidget(parent, Qt::FramelessWindowHint) //無邊框窗體 3: { 4: initData(); //初始化數據,這個demo裡面就兩個,具體下面有解釋 5: initVisualComponents(); //初始化私有可視部件,這個demo裡面沒有私有的其它部件,所以只做了窗口的一些屬性設置 6: setupContextMenu(); //設置右鍵菜單,分配各種QAction內存空間以及連接SIGNALS和SLOTS 7: setAttribute(Qt::WA_DeleteOnClose); //關閉事件發生後就主動從內存中銷毀窗口 8: setAttribute(Qt::WA_TranslucentBackground); //透明背景支持 9: } 拖拽移動窗體(下面有圖示): 1:void ShapedWidget::mousePressEvent(QMouseEvent *event) 2: { 3:if(event->button() == Qt::LeftButton) 4: { 5: *dragPos_ = event->globalPos() - frameGeometry().topLeft(); 6: event->accept(); 7: } 8: } 9: 10:void ShapedWidget::mouseMoveEvent(QMouseEvent *event) 11: { 12:if(event->buttons() & Qt::LeftButton) 13: { 14: move(event->globalPos() - *dragPos_); 15: event->accept(); 16: } 17: } 窗口繪制: 1:void ShapedWidget::paintEvent(QPaintEvent *) 2: { 3: QPainter painter(this); 4: painter.fillRect(0, 0, backgroundPixmap_->width(), backgroundPixmap_->height(), *backgroundPixmap_); 5: } 更換皮膚: 1:void ShapedWidget::changeSkin() 2: { 3: QAction* source = qobject_cast<QAction*>(sender()); //獲取發送該信號的信號源,並轉換對象 4: backgroundPixmap_->load(source->data().toString()); //因為給每個 QAction 賦了圖片的地址的字元串 5://所以可以通過 data() 來獲取該值,並更新背景圖片的內容 6: resize(backgroundPixmap_->width(), backgroundPixmap_->height()); //窗口大小盡可能小,盡管在 mask 外的窗體不會響應 mouse event 7: clearMask(); //清除原來的 mask 8: setMask(backgroundPixmap_->mask()); //根據新的背景圖片來重新設置 mask 9: update(); //更新窗口 10: }
❷ QT快捷截圖怎麼操作
截圖功能是QT語音為游戲玩家和娛樂玩家打造的功能,共享好玩有趣的圖片給房間內的好友,交流更方便。
使用方法:
用戶點擊輸入框左側的截圖按鈕,或通過截圖熱鍵(Ctrl+Alt+F9)使用截圖功能。
點擊輸入框中的縮略圖可以收起和展開預覽氣泡,點擊預覽氣泡右下角的圖標,可以刪除圖片,圖片一次只能發送一張。
截圖熱鍵可在系統設置-基本設置-熱鍵中自定義。
其他功能:
用戶也可以通過復制其他聊天軟體(如QQ)的圖片粘貼到QT的輸入框中進行發送,也可以選擇一個圖片文件(支持jpg和gif)進行復制,粘貼到QT的輸入框中。
使用限制:
1.普通圖片如jpg和png圖片最大不能超過1MB,gif圖片不能超過50k。
2.房間人數大於等於500人時,只有管理員才可以發送圖片。
3.房間人數大於等於10000人、圖片大於300KB、圖片尺寸過大時,接受到的圖片不會自動下載。
4.用戶每天(24小時內)發送圖片數量的上限是100張。
5.圖片尺寸寬度486*400後按比例縮放顯示,雙擊圖片可查看原圖。
6.V3.2以下版本不支持截圖發圖功能,收到圖片後顯示為空白。
功能管理:
1.管理員可在子房間設置-公屏聊天中,設置「禁止遊客發送圖片」「限制圖片發送速度」
2.管理員可以對子房間進行右鍵操作,禁止該子房間所有人發送圖片。
3.管理員可以對子房間進行右鍵操作,禁止該子房間所有人發送圖片。
4.用戶可在公屏空白處右鍵菜單內勾選「屏蔽圖片」,設置後接受到的圖片不會自動下載。
5.圖片緩存可以通過QQ電腦管家類的安全軟體進行清理。
❸ qt中如何去掉主窗口標題欄
#include <QtGui/QApplication>
#include <qtextcodec.h>
#include <QtGui/QDialog>
#include <QtCore/QTimer>
#include "widget.h"
int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QApplication a(argc, argv);
QDialog dialog;
dialog.setStyleSheet(QString::fromUtf8("background-image: url(:/images/1.PNG);/n"
"color: rgb(0, 255, 0);/n"
"font: 75 16pt /"/345/256/213/344/275/223/";"));
dialog.setGeometry(QRect(50, 50, 350, 250)); //可設置窗口顯示的方位與大小
dialog.setWindowFlags(Qt::FramelessWindowHint); //也是去掉標題欄的語句
Widget w;
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &w, SLOT(showNormal()));
QObject::connect(&timer, SIGNAL(timeout()), &dialog, SLOT(accept()));
timer.start(5000);
dialog.exec();
w.showNormal(); // 1、可更改的地方。
return a.exec();
}
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QMessageBox::StandardButton message;
QApplication::setStyle(QStyleFactory::create("plastique"));
QApplication::setPalette(QApplication::style()->standardPalette());
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(mountMessage()));
connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(umountMessage()));
connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(saveMessage()));
connect(ui.pushButton_5, SIGNAL(clicked()), this, SLOT(adjustMessage()));
connect(ui.pushButton_7, SIGNAL(clicked()), this, SLOT(about_usMessage()));
connect(ui.pushButton_4, SIGNAL(clicked()), this, SLOT(stop_saveMessage()));
connect(ui.pushButton_6, SIGNAL(clicked()), this, SLOT(touchMessage()));
connect(ui.pushButton_8, SIGNAL(clicked()), this, SLOT(exitMessage()));
mount_u(); //掛載U盤成功!
if( !have_video() ) { //if have WebCam?
message = QMessageBox::information(this, tr("攝像頭未連接"),
tr("攝像頭未連接,請連接攝像頭。") );
}
setWindowFlags(Qt::FramelessWindowHint); /2、可更改的地方
setWindowTitle(tr("歡迎使用迷你監控器!"));
}
程序中更改兩處顯示主窗口的樣式。
1、該處可設置窗口大小樣式,有四種選擇
w.show(); 實際大小
w.showEvent() 自定義大小
w.showFullScreen(); 全屏
w.showMaximized(); 最大化
w.showMinimized(); 最小化
w.showNormal(); 正常
2、該處是去掉窗口標題欄的語句
❹ 在Qt中如何設置Windows應用程序的圖標和窗口圖標
設置windows窗口圖標的方法:
this->setWindowIcon(QIcon("myapp.png"));
設置應用程序的方法:
1、在你的工程目錄創建一個txt文檔,寫入:
IDI_ICON1ICON"app.ico"
2、重命名改文件為*.rc.,比如app.rc
3、在工程*.pro中添加如下代碼
RC_FILE=app.rc
4、拷貝一張ico的圖片至工程目錄,命名為app.ico,編譯即可。
❺ qt中主窗口背景設置
以前遇到的很多小知識,從今天開始都一點一點記錄下來。。。
窗口背景無非兩種:背景色、背景圖片。Qt中窗口背景如何設置?下面介紹三種方法:
一、QPalette設置背景
二、實現paintEvent,使用QPainter來繪制背景
三、使用QSS來設置背景
關於QSS的使用不想多說,一般我不用QSS設置窗口背景,也不建議使用。(注意:這里是對於窗口而言)。如果是子部件當然可以。因為窗口使用QSS設置背景之後,若子部件不使用同樣的方式來設置,默認則會繼承父窗口的樣式
子部件一般情況下也不需要設置背景圖片,即使需要使用QSS也完全可以滿足。設置較多的是背景色與圖標,QSS中使用background或者background-color的方式可以實現背景色的設置,圖標則可以使用setPixmap或者setIcon來設置!
下面介紹QPalette以及paintEvent
一、QPalette設置背景
構造函數中可以使用如下方式:
(1)設置背景色
QPalette palette(this->palette());
palette.setColor(QPalette::Background, Qt::black);
this->setPalette(palette);
或:
QPalette palette;
palette.setBrush(this->backgroundRole(), Qt::black);
this->setPalette(palette);
這里setColor和setBrush都可以使用!
(2)設置背景圖片
QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());
QPalette palette(this->palette());
palette.setBrush(QPalette::Background, QBrush(pixmap));
this->setPalette(palette);
上面方式無論設置背景色還是背景圖片QPalette::Background與this->backgroundRole()是等價的!
二、paintEvent設置背景
(1)設置背景色
void IIIMark::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::black);
painter.drawRect(this->rect());
}
(2)設置背景圖片
void IIIMark::paintEvent(QPaintEvent *)
{
QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());
QPainter painter(this);
painter.drawPixmap(this->rect(), pixmap);
}
注意:
(1)以上都是用scaled方式對圖片進行了適應窗口大小的設置,因為所給的圖片大小不一定滿足要求,所以採用此方式!當然圖片經過拉伸或者壓縮之後會變形(純色圖片除外),所以對圖片採用此方式時需要注意。
(2)設置背景范圍的時候如果需要充滿整個窗口最好使用this->rect(),因為我看到很多人在使用QRect(0, 0, 400, 400)之類的語句,那麼如果窗口大小改變了呢?此句是不是要跟著變呢?
(3)如果需要背景圖片或者背景色隨可以發生改變時,也就是所謂的換膚功能,則採用paintEvent的方式,在需要改變的時候使用update()來進行更新。
(4)this->setAutoFillBackground(true)又讓我想起了tr(),被很多人濫用。這句話在什麼時候使用呢?不妨採用QPalette設置背景的方式加上與去掉這句話對比一下(在有父窗口的情況下使用)。如果這個QWidget直接show,則有背景色,如果放到一個父窗口中,就沒有效果。添加該句即可!
❻ Qt中布局裡有布局,如何刪除內嵌布局
先獲取之前的布局,然後刪除布局,再刪除控制項。
這里刪除的時候先獲取之前的布局,然後刪除布局,再刪除控制項,控制項刪除時是按照類型來刪除的,主要由其父窗口來看類型,找到某一類的控制項,然後返回對應的列表,然後刪除,另外創建控制項後根據控制項的數量調整布局所在窗口的大小。
當根據數據來創建控制項並布局時,如果數據更新,那麼之前創建的控制項便需要刪除後重新創建布局。
❼ Qt裡面怎麼繪制透明圖,鏤空圖之類的
1、打開一張水果圖片 2、(示例圖) 3、將水果摳出,復制生成圖層1。 4、單擊工具箱中的「鋼筆工具」按鈕,繪制出如圖二所示的鋼筆路徑。 5、單擊工具箱中的「路徑選擇工具」,按住「Shift+Alt」鍵,在繪制的路徑上按住左鍵向下拖拽滑鼠,對其進行復制,效果如下: 6、單擊工具箱中的「轉換點工具」,對控制柄進行調整效果如下圖所示。 7、將路徑轉換為選區,然後將「圖層1」設置為當前層,按刪除鍵刪除選擇區內的圖形,如下: 8、取消選區,再單擊「路徑」面板中的「工作路徑」將其選擇,然後單擊「路徑」面板右上角的三角按鈕,在彈出的菜單中選擇「存儲路徑」命令。 9、在彈出的對話框中,將「工作路徑」存儲為「路徑2」,單擊好,將「路徑2」復制生成為「路徑2副本」。 10、單擊工具箱中的「路徑選擇工具」,在畫面中選取鋼筆路徑,然後選擇菜單欄中的「編輯」「變換路徑」「垂直翻 轉」命令,將路徑垂直翻轉,效果如下圖所示。 11、單擊工具箱中的「轉換點工具」,將翻轉後的鋼筆路徑調整至如下圖所示。 12、用同樣的方法,將復制出的鋼筆路徑依次選擇並垂直翻轉,然後調整至如下圖所示的形態。 13、單擊工具箱中的「橢圓」按鈕,在畫面中繪制出如下圖所示的橢圓選區。 14、單擊路徑面板底部的將「選區轉換為路徑」如圖十,然後按「Ctrl+X」鍵,將轉換的鋼筆路徑剪切到剪貼板中。 15、將「路徑2副本」設置為當前工作狀態,按「Ctrl+V鍵,將路徑粘貼到」路徑2副本「中。 16、按「Ctrl+T」鍵,為路徑添加自由變形框,調整效果如下圖所示。 17、新建圖層2,調整到圖層1的下方,然後按將路徑轉換為選區。 18、設置前景色為黑色,背景色為灰色,然後單擊「漸變」工具,由上至下填充漸變色,如下: 19、取消選區,選擇菜單欄中的「濾鏡」「雜色」「添加雜色」命令,彈出「添加雜色」對話框,參數設置如下圖: 20、調整「色相/飽和度」對話框,參數設置如圖: 21、將「路徑2」顯示在畫面中。 22、回到圖層面板,新建「圖層3」,設置前景色為淺灰色。 23、選擇工具箱中的「畫筆」,設置如下圖。 24、打開「路徑」面板,單擊其下方的「描邊路徑」,用設置的筆頭描繪路徑,然後在灰色區單擊,將路徑隱藏, 用「橡皮」工具將描繪的下方檫除。 25、將「路徑2副本」顯示在畫面中,打開「圖層」面板,新建「圖層4」並調整到圖層1的下方。 26、打開「路徑」面板,單擊其下方的「描邊路徑」,用設置的筆頭描繪路徑,然後在灰色區單擊,將路徑隱藏,用 「橡皮」工具將描繪的下方檫除,將不透明度設置為60%效果如圖: 27、將圖層合並為圖層1,復制並調整圖層1,製作投影效果,如圖: 填充黑色,高斯模糊,完成最終效果如圖!
❽ qml刪除載入的文件夾載入qrc圖片
在目錄里刪除,文件夾依然存在,載入圖片也會報錯。
第一,在文件夾中打開工程目錄,刪除資源文件夾,再用QTCreater打開項目,工程目錄中的qml。qrc,拖到QTCreater,第二,拖拽後,會出現以下界面,點擊RemovingMissingFiles,關閉項目,重新打開就可以了。
在QT的開發中需要添加圖片等資源文件,以下是添加方法。1工程目錄中新建文件夾,命名自定義(如my_resource),需要至少添加一個圖片或其他文件。2打開項目,選擇根目錄,點擊右鍵,添加現有文件,選擇圖片。
❾ qt怎麼在主頁設置照片
你好!先找到自己右鍵點擊 ,選擇個人設置之後出來一個頁面,可以設置照片。
❿ qt實現多張圖片的切換不使用ui控制項
通過上方控制項中,尋找所適合的控制項,之後將其拖拽到自己合適的位置上:
具體布局如下圖所示:
2.設置ui控制項名稱
如上圖所示,我將每一個單選按鈕都設置了相對應的名字,分別為上方的radioButton_16 /32 /64 /128 /256
其餘的控制項也都設置了相應的類名(名字),那我們就來使用它們吧.
3.使用控制項進行界面交互
3.1 選擇圖片
右鍵點擊選擇圖片按鈕,之後點擊轉到槽選項,繼續點擊彈出框中的clicked()點擊交互按鈕『會自動跳轉到寫入代碼的位置,同時在Headers下的app.h中,會自動導入插槽內』意味著,我們能通過這個點擊事件來展示我們所需要的交互內容.
那麼,著手於代碼的操作吧:
『在Sources下的app.cpp中』
我們能看到自動生成的代碼塊,其中:
app 我們所掛載的媒介,這個媒介app下,仍有著其他的屬性
pushButton_file 這個按鈕的名字
clicked 點擊事件
不信的話你可以試著點擊ui界面的最底層區域,這樣我們就能看到objectName的值是app了,當然,不要試圖在你寫代碼期間修改這個媒介,否則,有你好受的…
void app::on_pushButton_file_clicked()
{
fileName = QFileDialog::getOpenFileName(this,tr("Open File"),".",tr("Images(*.png*.jpeg *.jpg)"));
//獲取圖片的路徑 不過 一定要在「 app.h」里,加入以下頭文件 #include <QFileDialog>
// #include <QDebug>
// #include <QFileInfo>
// 同時在『app.h』的private中,加入: QString fileName; 否則會找不到這個名字從而報錯
qDebug() << "fileName=" << fileName;
QFileInfo fi(fileName);
QString name = fi.fileName();
ui->label_filename->setText(name);
//QT 文件信息 將路徑(fileName) 存儲在 fi中, 然後 獲取到fi裡面的文件名稱
//在這里,fi.fileName() 中的fileName並不是路徑,而是路徑中 所在的文件信息
//比如 fileName= "C:/Users/power/Pictures/0.jpg" 那麼『name』就是 0.jpg
//之後賦值給name,緊接著將這個name的值 送到 ui內的組件label_filename上,起名為 name
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上方,『ui->label_filename』代表的是整個ui界面下,一個叫做label_filename的文本框,被設置了叫做『name』的名字, 名字為選擇圖片的文件名,比如: 0.jpg
簡單來說: 我所拖拽到ui界面中的所有控制項,都是ui的兒子,那麼 作為父親是不是隨時可以調用自己的兒子呢?(這點毋庸置疑)
效果圖:
心細的在左上角會發現一個圖片,那麼,我們怎麼導入這個圖片,使得個性化呢
3.2 個性化窗口圖片
右鍵這個工程文件->在出現的菜單中選擇Add New選項,接著選擇左側Qt,在右側選擇Qt Resourse File,最後選擇右下方choose按鈕.接著在File name中寫入文件名為images,(可以寫別的文件名,並不一定要這個),下一步後點擊完成.
這些操作都完成後,會在工程文件下出現Resources,並且在內部存在一個images.qrc文件
那麼,我們接著右鍵->添加現有文件
隨後會彈出一個窗口,在其中我們選擇images,並選擇其中的圖片,這樣圖片就載入進來了.(一定要提前在這個工程文件下放入images文件夾,同時將文件夾中放入圖片.)
之後在app.ui中,選中整個窗口,找到windowicon,然後點擊三角,選擇資源後,將圖片放入.就有圖標嘍
RC_ICONS = images/logo.ico
1
如果想發布時帶有圖標,一定要在XX.pro文件內,寫上這句話:
3.3 默認選中單選框
正常來說,我們會默認選中一個單選框,使得界面美觀
這樣,我們就默認選中64X64的了
3.4 預覽圖片
同上,選擇『預覽圖片』,右鍵 轉到槽 『仍然是點擊事件』,之後在『app.h』中private屬性下加入,並加入頭文件:
void app::on_pushButton_showPic_clicked()
{
if(ui->radioButton_16->isChecked()){ //16X16被選中的話
picHeight = 16;
picWidth = 16;
}else if(ui->radioButton_32->isChecked()){
picHeight = 32;
picWidth = 32;
}else if (ui->radioButton_64->isChecked()) {
picHeight = 64;
picWidth = 64;
}else if (ui->radioButton_128->isChecked()) {
picHeight = 128;
picWidth = 128;
}else if (ui->radioButton_256->isChecked()) {
picHeight = 256;
picWidth = 256;
}
qDebug() << "picWidth:" << picWidth;
qDebug() << "picHeight:" << picHeight;
if(!fileName.isEmpty()){ //判斷文件名是否為空
QPixmap map(fileName);
QPixmap newMap = map.scaled(picWidth,picHeight);
ui->label_picture_show->setPixmap(newMap);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
picHeight 自己設置的圖片的高度
picWidth 自己設置的圖片的寬度
isChecked 代表 是否選中當前的元素
總而言之,就是我選擇其中一個按鈕,然後根據自己設置的圖片大小,設置你所展示的圖片大小,比如: