⑴ qt的stylesheet中如何設置屬性使背景圖自動調整來適應控制項的大小,急求!
A background-image does not scale with the size of the widget. To provide a "skin" or background that scales along with the widget size, one must use border-image. Since the border-image property provides an alternate background, it is not required to specify a background-image when border-image is specified. In the case, when both of them are specified, the border-image draws over the background-image.
默認background-image 不會縮放圖片以適應控制項的大小。
如果要提供一個皮膚或背景圖片以自動適應控制項大小,
必須也只能用border-image屬性。
因為border-image已經設置了可用的背景圖片,
所以使用了border-image後,沒必要再指定background-image。
如果同時指定了兩個屬性,那麼將會使用border-image 繪制覆蓋掉background-image。
例子中的
QMainWindow > .QWidget {
background-color: gainsboro;
background-image: url(:/images/pagefold.png);
background-position: top right;
background-repeat: no-repeat
}
把上面的改成:
QMainWindow > .QWidget {
background-color: gainsboro;
border-image: url(:/images/pagefold.png);
}
就能實現你要的效果了,自動將pagefold.png拉伸填滿整個背景。
⑵ qt編程label顯示圖片,如何在圖片上繪制相應圖形呢
繼承QLabel唄
#include <QPainter>
#include <QMouseEvent>
Label::Label(QWidget *parent) :
QLabel(parent)
{
isRelease = true;
point = QPoint(0, 0);
setScaledContents(true);
}
void Label::mousePressEvent(QMouseEvent *e)
{
point = e->pos();
isRelease = false;
update();
}
void Label::mouseMoveEvent(QMouseEvent *e)
{
point = e->pos();
isRelease = false;
update();
}
void Label::mouseReleaseEvent(QMouseEvent *)
{
isRelease = true;
update();
}
void Label::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(rect(),QPixmap("../123.jpg"));
if(!isRelease)
painter.drawEllipse(point,20,20);
}
⑶ Qt中如何利用 png 圖片來實現自定義形狀的窗口
使用 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() 函數對窗口進行部分區域遮掩來實現各種形狀的窗口。部分代碼解釋:頭文件: 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()); //窗口大小盡可能小
⑷ 求教各位QT高手,如何實現抗鋸齒的圓形頭像
參考QT DEMO(Image Composition),採用圖片混合透視的方式獲得圓形切圖。
關鍵代碼:painter.setCompositionMode(QPainter::CompositionMode_SourceOut);
QT提供了多種圖片很合方式,經過測試,如果其他項不調整,只有QPainter::CompositionMode_SourceOut這種方式適合。
透視圖mask.png,試過中間圓是黑,周邊空的,在Image Composition上不能透出圓形圖。
示例代碼:
QImage getRoundQImage(QSize size/*const QImage& head*/)
{
QImage resultImage(size,QImage::Format_ARGB32_Premultiplied);
QImage head("user.png");
head = head.scaled(size);
QImage head_mask("mask.png");
QPainter painter(&resultImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(resultImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(0, 0, head_mask);
painter.setCompositionMode(QPainter::CompositionMode_SourceOut);
painter.drawImage(0, 0, head);
painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
painter.end();
return resultImage;
}
void getRoundPixmap(QPixmap& src,QSize size)
{
QImage resultImage(size,QImage::Format_ARGB32_Premultiplied);
QPixmap head_mask("mask.png");
QPainter painter(&resultImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(resultImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawPixmap(0, 0, head_mask);
painter.setCompositionMode(QPainter::CompositionMode_SourceOut);
painter.drawPixmap(0, 0, src.scaled(size));
painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
painter.end();
src = QPixmap::fromImage(resultImage);
}
⑸ QT怎麼給控制項設置背景圖片
1 MLCNWidget *w=new MLCNWidget;
w->setAutoFillBackground(true);
QPalette palette;
palette.setBrush(w->backgroundRole(), QBrush(QPixmap("./pic/new_images/bg.jpg")));
w->setPalette(palette);
w->showFullScreen();
2 使用QSS
控制項->setStyleSheet("background-image:url(./pic/new_images/start_jiankong.png)");
這樣做的一個缺點是一旦在一個控制項中使用StyleSheet了,其中的子控制項就全部會繼承,也就是在上面顯示主控制項的背景了。在網上看到可以通過*{}的方式防止繼承,但我試了下,沒成功,不知道到底行不行。
3 關於label上加圖片的
估計除了widget,加的最多的就是QButton和QLabel了,QLabel裡面看QT文檔可以發現有個槽,setPixmap,用了下,特別好用。
ui.label_5->setPixmap(QPixmap("./pic/new_images/start_jiankong.png"));
⑹ 如何用Qt畫出實心圓
QPainter painter(this);
painter.setPen(QPen(Qt::blue,4));//設置畫筆形式
painter.setBrush(QColor(255,0,0));//設置畫刷,如果不畫實現的直接把Brush設置為setBrush(Qt::NoBrush);
painter.drawEllipse(20,20,200,200);//畫圓
⑺ qt圓角按鈕與圖片背景沖突
現在要實現一個部分圓角的控制項,而且這個控制項需要設置背景圖片。
可以使用自己繪制的方式。但Qt提供的樣式是一種更簡單的方式。
不過三種設置圖片方式是有區別的。
1. image:載入圖片的顯示效果最好,但不能設置圓角
2. border-image:載入圖片的效果尚可,可以設置圓角
3. background-image:不能載入高清圖,可以設置圓角。
⑻ QT中怎麼把圖片設置為桌面背景
void Background::paintEvent( QPaintEvent * event ){
QPixmap pixmap = QPixmap("123.bmp").scaled(this->size());
QPainter painter(this);
painter.drawPixmap(this->rect(), pixmap);
}設置QT程序的背景
⑼ qt中如何將png設置為背景(怎麼將圖片平鋪)
MyWidget*w=new MyWidget;
QPalette palette;
palette.setBrush(w->backgroundRole(), QBrush(QPixmap("./pi/backGround.PNG")));
w->setPalette(palette);
w->show();
按上面的做就可以設置背景了,注意替換你自己的widget的類和圖片的路徑
⑽ 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,則有背景色,如果放到一個父窗口中,就沒有效果。添加該句即可!