C++ 如何在具有背景图像的小部件上创建不可见按钮?
我想制作一个带有不可见按钮的简单应用程序 我通过UI属性样式表和资源为我的小部件设置背景图像-C++ 如何在具有背景图像的小部件上创建不可见按钮?,c++,qt5,qwidget,qpushbutton,C++,Qt5,Qwidget,Qpushbutton,我想制作一个带有不可见按钮的简单应用程序 我通过UI属性样式表和资源为我的小部件设置背景图像- 边框图像:url(:/image.jpg)。 我总是得到这样的东西 然后我试着在上面加上按钮 我在试着用 ui->pushButton->setStyleSheet("QPushButton{background: transparent;}"); ui->pushButton->setStyleSheet("background-color: rgba(255, 255,
边框图像:url(:/image.jpg)。 我总是得到这样的东西 然后我试着在上面加上按钮 我在试着用
ui->pushButton->setStyleSheet("QPushButton{background: transparent;}");
ui->pushButton->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
它可以在默认背景下使用按钮,但在我的例子中不适用
我添加的每个按钮都采用默认的父背景图像。我不想看到任何按钮的提示,但当我点击某个区域以执行某些功能时
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->centralWidget->setStyleSheet("background-image:url(:image.jpg)");
ui->pushButton->setStyleSheet("QPushButton{border:none;}");
}
上面的代码使按钮平坦,但无论如何它都会从父窗口小部件复制背景图像
你知道怎么解决吗?我认为在这里回答比在评论中回答更好 您只需为
QPushButton
设置以下样式表即可使其不可见:
QPushButton
{
border: none;
}
我做了测试,效果很好
对于测试,我设置了包装小部件的背景图像
属性。我还使用background color
属性做了另一个测试。它在两种情况下都有效(无论背景是纯色还是图片/照片)
我希望有帮助
编辑: 我已经编写了一个小部件,它可以执行您想要的功能。我还提供了一个窗口,以使下面的示例最小化和完整,以便您可以复制它 我已经测试过了,效果很好 测试h:
\ifndef测试
#定义测试
#包括
#包括
类WidgetWithHiddenButton:公共QWidget
{
Q_对象
受保护的:
QPushButton*不可见按钮;
公众:
WidgetWithHiddenButton(QWidget*parent=nullptr);
QPushButton*getButton();
受保护的:
无效paintEvent(QPaintEvent*)覆盖;
};
类TestWindow final:公共QMainWindow
{
Q_对象
私人:
WidgetWithHiddenButton*小部件;
公众:
TestWindow();
};
#endif//测试
test.cpp:
#包括“test.h”
#包括
#包括
#包括
#包括
WidgetWithHiddenButton::WidgetWithHiddenButton(QWidget*父项):QWidget(父项)
{
//根据需要构建小部件。
不可见按钮=新的QPushButton(“这是一个按钮”,this);
QVBoxLayout*lay=新的QVBoxLayout;
QHBoxLayout*内部布局=新的QHBoxLayout;
内部铺设->添加拉伸();
内部布局->添加小部件(不可见按钮);
内部铺设->添加拉伸();
铺层->添加布局(内部铺层);
此->设置布局(布局);
这->设置样式表(“WidgetWithHiddenButton{background image:url(path_to_image/image.jpg);}”);
不可见的_按钮->设置样式表(“QPushButton{border:none;}”);
}
QPushButton*WidgetWithHiddenButton::getButton()
{
返回按钮;
}
void WidgetWithHiddenButton::paintEvent(QPaintEvent*)
{
qstyleopt;
选择初始(本);
油漆工p(本);
style()->drawPrimitive(QStyle::PE_小部件,&opt,&p,this);
}
TestWindow::TestWindow()
{
调整大小(500300);
widget=newwidgetwithhiddenbutton;
此->setCentralWidget(小部件);
连接(widget->getButton(),&QPushButton::clicked,qApp,&QApplication::quit);
}
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
测试窗口tw;
tw.show();
返回app.exec();
}
可以随意调整它(特别是通过更改类名,因为WidgetWithHiddenButton
非常难看:)
注意事项:
- 我在按钮中写入了一个文本,以使其可见(用于测试目的),但如果您希望按钮完全不可见,可以将其删除
- 我将
信号连接到QPushButton::clicked()
插槽,以便在单击按钮区域时执行操作QApplication::quit()
- 我重新定义了
方法,因为在自定义paintEvent()
上使用QWidget
宏和样式表时需要它Q_OBJECT
- 请随意修改我在构造器中构建小部件的方式(布局、大小等),使其符合您的要求
ui->centralWidget->setStyleSheet("background-image:url(:image.jpg)");
到
重要提示:注意QWidget
前面的点。它意味着对QWidget进行样式化,但不包括子类。这是必要的,因为QPushButton
是QWidget
的子类,否则也会受到影响
然后,您可以将按钮的背景颜色设置为透明,就像您使用
ui->pushButton->setStyleSheet("QPushButton{background: transparent;}");
例子
下面是我为您准备的一个简单示例,用于演示建议的解决方案(需要pix/images
下的资源文件中的cat.png
):
#包括
#包括
#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=nullptr):
QMainWindow(父窗口){
auto*widget=新的QWidget(此);
自动*按钮=新的QPushButton(小部件);
小部件->设置样式表(“.QWidget{”
“背景图像:url(':/pix/images/cat.png');”
“背景重复:无重复;”
"}");
按钮->设置样式表(“.QPushButton{”
“背景色:透明”
"}");
按钮->移动(100100);
按钮->调整大小(100100);
连接(按钮,&QPushButton::单击,[](){
qDebug(“点击”);
});
setCentralWidget(小部件);
调整大小(600480);
}
};
结果
给出的例子是produc
ui->centralWidget->setStyleSheet("background-image:url(:image.jpg)");
ui->centralWidget->setStyleSheet(".QWidget { background-image:url(:image.jpg) }");
ui->pushButton->setStyleSheet("QPushButton{background: transparent;}");
#include <QMainWindow>
#include <QWidget>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr) :
QMainWindow(parent) {
auto *widget = new QWidget(this);
auto *button = new QPushButton(widget);
widget->setStyleSheet(".QWidget {"
" background-image:url(':/pix/images/cat.png');"
" background-repeat: no-repeat;"
"}");
button->setStyleSheet(".QPushButton {"
" background-color: transparent"
"}");
button->move(100, 100);
button->resize(100, 100);
connect(button, &QPushButton::clicked, [](){
qDebug("clicked");
});
setCentralWidget(widget);
resize(600, 480);
}
};