C++ 如何在具有背景图像的小部件上创建不可见按钮?

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,

我想制作一个带有不可见按钮的简单应用程序

我通过UI属性样式表和资源为我的小部件设置背景图像-
边框图像: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
    宏和样式表时需要它
  • 请随意修改我在构造器中构建小部件的方式(布局、大小等),使其符合您的要求
原因 一个常见的误解是,当一个没有A的样式表应用于一个元素时,它只用于该元素。事实上,所有元素的子元素都是样式化的。因此,应使用选择器来实现预期结果

解决方案 我建议您更改代码中的这一行

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);
    }
};