qlabel可以选中吗_QPushButton/QLabel在鼠标悬浮(划过, hover)、选中(单击, pressed)状态下更换图标样式...

本文介绍了如何在Qt编程中为QPushButton和QLabel设置图标样式,包括在鼠标悬浮、选中状态下改变图标。分别展示了通过样式表设置border-image、继承自定义控件以及使用事件过滤器三种方法,并分析了各自的优缺点。示例代码详细演示了实现过程。
摘要由CSDN通过智能技术生成

三种图标样式(从左往右分别是normal,hover,pressed):

先上效果图:

(1)第一种方法:在样式表中设置border-image(在网上看到有人使用background-image的,不推荐,因为那样的话图标大小是不会自动缩放的,有兴趣的可以试一下)。

QPushButton *button1 = new QPushButton(this);

button1->setFixedSize(30, 30);

button1->setFlat(true);

button1->setStyleSheet("QPushButton{border-image:url(:/listBar_Icon/add.png);}"

"QPushButton:hover{border-image:url(:/listBar_Icon/add_hover.png);}"

"QPushButton:pressed{border-image:url(:/listBar_Icon/add_pressed.png);}");

优点 :简单方便。

缺点 : border-image会随着QPushButton的大小尺寸变化(图标会填充整个按钮)。上面的例子中按钮形状和图标素材都是正方形的,所以效果不错。如果QPushButton只显示图标的话用这种方法比较好,如果需要添加文字而导致按钮形状和素材不同,这种方法则不可取。比如倘若把按钮尺寸由(30,30)改成(60,30)就会变成下面这样:

(2)第二种方法:继承QPushButton,重写event事件。效果和第一个gif相同。

mypushbutton.h

#ifndef MYPUSHBUTTON_H#define MYPUSHBUTTON_H#include#include

class MyPushButton : publicQPushButton

{

Q_OBJECTpublic:

MyPushButton(QWidget*parent =nullptr);void setUpIcon(const QIcon &icon, const QIcon &icon_hover, const QIcon &icon_pressed);~MyPushButton();protected:bool event(QEvent *event) override;private:

QIcon Img;

QIcon Img_hover;

QIcon Img_pressed;

};#endif //MYPUSHBUTTON_H

mypushbutton.cpp

#include "mypushbutton.h"#includeMyPushButton::MyPushButton(QWidget*parent)

: QPushButton(parent)

{

}

MyPushButton::~MyPushButton()

{

}void MyPushButton::setUpIcon(const QIcon &icon, const QIcon &icon_hover, const QIcon &icon_pressed)

{

Img=icon;

Img_hover=icon_hover;

Img_pressed=icon_pressed;

setIcon(Img);

}bool MyPushButton::event(QEvent *event)

{switch (event->type())

{caseQEvent::Enter:

setIcon(Img_hover);break;caseQEvent::Leave:

setIcon(Img);break;caseQEvent::MouseButtonPress:

setIcon(Img_pressed);break;caseQEvent::MouseButtonRelease:

setIcon(Img_hover);break;default:break;

}return QPushButton::event(event);

}

使用MyPushButton类:

见最后

第三种方法:原理及优缺点和第二种方法相同,只是不需要继承QPushButton,而是重写主窗口的事件过滤器。

mybutton2.h

class test : publicQWidget

{

Q_OBJECTpublic:explicit test(QWidget *parent =nullptr);private:

QPushButton*button3 =nullptr;voidinitUi();protected:bool eventFilter(QObject *obj, QEvent *event) override; //事件过滤

};

mybutton2.cpp

test::test(QWidget *parent) : QWidget(parent)

{

initUi();

}voidtest::initUi()

{

button3= new QPushButton(this);

button3->setFixedSize(30, 30);

button3->setFlat(true);

button3->setIcon(QIcon(":/listBar_Icon/add.png"));

button3->setStyleSheet("QPushButton{border:0px solid rgba(0, 0, 0, 255);}");

button3->setIconSize(QSize(30, 30));

button3->installEventFilter(this); //安装事件过滤器

}bool test::eventFilter(QObject *obj, QEvent *event)

{switch (event->type()) {caseQEvent::HoverEnter:if(obj ==button3)

button3->setIcon(QIcon(":/listBar_Icon/add_hover.png"));break;caseQEvent::HoverLeave:if(obj ==button3)

button3->setIcon(QIcon(":/listBar_Icon/add.png"));break;caseQEvent::MouseButtonPress:if(obj ==button3)

button3->setIcon(QIcon(":/listBar_Icon/add_pressed.png"));break;caseQEvent::MouseButtonRelease:if(obj ==button3)

button3->setIcon(QIcon(":/listBar_Icon/add_hover.png"));break;default:break;

}return QWidget::eventFilter(obj, event);

}

第二种和第三种方法的使用:

#include "mypushbutton.h"#include"mybutton2.h"#include#include#include

int main(int argc, char *argv[])

{

QApplication a(argc, argv);MyPushButton*button2 = newMyPushButton();

button2->setWindowFlag(Qt::FramelessWindowHint);

button2->setAttribute(Qt::WA_TranslucentBackground);

button2->setFixedSize(60, 30);

button2->setFlat(true);

button2->setUpIcon(QIcon(":/listBar_Icon/normal.jpg"), QIcon(":/listBar_Icon/pressed.jpg"), QIcon(":/listBar_Icon/released.jpg"));

button2->setStyleSheet("QPushButton{border:0px solid rgba(0, 0, 0, 255);}");

button2->setIconSize(QSize(60, 30));

QObject::connect(button2,MyPushButton::clicked,

[]()

{

qDebug()<

});

button2->show();

MyButton2*button3=newMyButton2();

button3->setWindowFlag(Qt::FramelessWindowHint);

button3->setAttribute(Qt::WA_TranslucentBackground);

button3->setFixedSize(60, 30);

button3->setStyleSheet("QPushButton{border:0px solid rgba(0, 0, 0, 255);}");

QObject::connect(button3,MyButton2::destroyed,

[]()

{

qDebug()<

});

button3->show();returna.exec();

}

果需要在按钮中添加文字,那么只能使用后面两种方法。 QLabel和QPushButton差不多,不再多说。

下面是一个简单的示例代码,可以创建一个多选下拉框,选中的内容将显示在选框中,点击按钮可以获取选中的值并弹窗显示。 ```python from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QLabel, QPushButton, QMessageBox class MultiSelectComboBox(QWidget): def __init__(self, parent=None): super().__init__(parent) self.initUI() def initUI(self): self.layout = QVBoxLayout() self.combobox = QComboBox(self) self.combobox.setEditable(True) self.combobox.setInsertPolicy(QComboBox.NoInsert) self.combobox.view().pressed.connect(self.handle_item_pressed) self.label = QLabel(self) self.label.setText("Selected items:") self.layout.addWidget(self.combobox) self.layout.addWidget(self.label) self.setLayout(self.layout) def handle_item_pressed(self, index): item = self.combobox.itemText(index) if item: if index.row() == -1: self.combobox.addItem(item) else: self.combobox.removeItem(index.row()) def getSelectedItems(self): selected_items = [] for index in range(self.combobox.count()): item = self.combobox.itemText(index) selected_items.append(item) return selected_items class MainWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.layout = QVBoxLayout() self.combobox = MultiSelectComboBox(self) self.layout.addWidget(self.combobox) self.button = QPushButton("Get Selected Items", self) self.button.clicked.connect(self.show_selected_items) self.layout.addWidget(self.button) self.setLayout(self.layout) def show_selected_items(self): selected_items = self.combobox.getSelectedItems() if selected_items: message = "Selected Items:\n\n" + "\n".join(selected_items) else: message = "No Items Selected!" QMessageBox.information(self, "Selected Items", message) if __name__ == "__main__": import sys app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在上面的代码中,我们定义了一个名为 `MultiSelectComboBox` 的自定义小部件,它继承自 `QWidget`。该小部件包含一个 `QComboBox` 和一个 `QLabel`,用于显示选中的项目。我们还定义了一个名为 `handle_item_pressed` 的方法,它将处理通过单击下拉框中的项来选择或取消选择该项的操作。我们还定义了一个名为 `getSelectedItems` 的方法,它将返回选中的项目。 在 `MainWindow` 类中,我们创建了一个 `MultiSelectComboBox` 实例,并将其添加到一个垂直布局中。我们还创建了一个 `QPushButton`,用于获取选中的项目,并将其添加到相同的布局中。当用户单击该按钮时,我们将显示一个包含选中项目的消息框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值