【问题标题】:How do I delete the drop-down arrow of the drop-down menu while keeping the border-image of QSS?如何在保留 QSS 的边框图像的同时删除下拉菜单的下拉箭头?
【发布时间】:2019-11-29 07:38:16
【问题描述】:

我将 QPushButton 更改为下拉菜单。我的代码如下:

m_menu = new QMenu(this);
        m_addAction = new QAction(m_menu);
        m_delAction = new QAction(m_menu);
        m_addAction->setText(QObject::tr("add"));
        m_delAction->setText(QObject::tr("del"));
        m_menu->addAction(m_addAction);
        m_menu->addAction(m_delAction);
 m_menu->setStyleSheet("\
                       QMenu {\
                       background-image: url(:/img/tanchu-1.png);; /*background-image*/\
                       border: 3px solid rgb(235,110,36);/*menu border*/\
                       }\
                       QMenu::item {\
                       font-size: 10pt; \
                       color: rgb(225,225,225);\
                       border: 3px solid rgb(60,60,60);\
                       background-image: url(:/img/tanchu-1.png);\
                       padding:160px 160px;\
                       margin:2px 2px;\
                       }\
                       QMenu::item:selected { \
                       background-color:rgb(235,110,36);\
                       }\
                       QMenu::item:pressed {\
                       border: 1px solid rgb(60,60,61); \
                       background-color: rgb(220,80,6); \
                       }\
                       ");
ui->pushButton->setMenu(m_menu);

我得到的按钮看起来像这样。右下角有一个黑色的下拉箭头。

但现在的问题是,当我使用

从下拉菜单中删除下拉箭头时
ui->pushButton->setStyleSheet("QPushButton::menu-indicator{image:none;}");

我使用 QSS border-image: url(:/img/btn_mid_0.png);为 QPushButton 设置的边框图像像 image2 一样消失。下拉箭头和边框图像一起消失。如何在保留之前设置的边框图像的同时删除下拉箭头? 此外,子菜单的宽度不会像 image3 这样随 qpushbutton 改变。如何将下拉菜单的宽度设置为与 QPushButton 一样宽? 谢谢!

我所有的代码如下: 主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:

private:
    Ui::MainWindow *ui;
    QMenu *m_menu;
    QAction *m_addAction;
    QAction *m_delAction;
    QPushButton *m_pushButton;

    void addFunc();
    void delFunc();
};

#endif // MAINWINDOW_H

主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMenu>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_menu = new QMenu(this);
        m_addAction = new QAction(m_menu);
        m_delAction = new QAction(m_menu);
        m_addAction->setText(QObject::tr("add"));
        m_delAction->setText(QObject::tr("del"));
        m_menu->addAction(m_addAction);
        m_menu->addAction(m_delAction);
        connect(m_addAction, &QAction::triggered, this, &MainWindow::addFunc);
        connect(m_delAction, &QAction::triggered, this, &MainWindow::delFunc);

 m_menu->setStyleSheet("\
                       QMenu {\
                       background-image: url(:/img/tanchu-1.png);; /*background-image*/\
                       border: 3px solid rgb(235,110,36);/*menu border*/\
                       }\
                       QMenu::item {\
                       font-size: 10pt; \
                       color: rgb(225,225,225);\
                       border: 3px solid rgb(60,60,60);\
                       background-image: url(:/img/tanchu-1.png);\
                       padding:160px 160px;\
                       margin:2px 2px;\
                       }\
                       QMenu::item:selected { \
                       background-color:rgb(235,110,36);\
                       }\
                       QMenu::item:pressed {\
                       border: 1px solid rgb(60,60,61); \
                       background-color: rgb(220,80,6); \
                       }\
                       ");
  ui->pushButton->setMenu(m_menu);

  ui->pushButton->setStyleSheet("QPushButton::menu-indicator{image:none;}");

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::addFunc()
{
    qDebug() << "addFunc";
}

void MainWindow::delFunc()
{
    qDebug() << "delFunc";
}

【问题讨论】:

  • 请提供完整示例,包括所有图片。例如,我们看不到您在按钮上设置边框图像的位置。虽然通过设置按钮 CSS 就像您在此处显示的那样,但您正在覆盖您之前可能在其上设置的任何 CSS。您需要获取现有的 CSS,然后将其 .append(),然后在按钮上设置结果。
  • "如何将下拉菜单的宽度设置为与 QPushButton 一样宽?"有点像一个单独的问题,但让我问一下,按钮是设置为固定宽度,还是会随着可用的布局大小而变化? (提示:固定宽度会更简单:)
  • 抱歉,我没有就我的问题提供足够的信息。我已将图像和所有代码添加到我的问题中。 QPushButton的border-image QSS在UI设计器中设置,其他通过mainwindow.cpp中的代码设置。
  • 我希望子菜单的宽度始终与 QPushButton 的宽度相同。与图 3 中的按钮较长不同,子菜单的长度仍与之前相同。
  • 我希望子菜单的宽度始终与 QPushButton 的宽度相同。与图 3 中的按钮较长不同,子菜单的长度仍与之前相同。

标签: qt qtstylesheets


【解决方案1】:

只需将所有按钮 CSS 设置在一个位置,或者在 QtCreator/Designer 属性中,在 C++ 代码中,而不是同时设置。基本上,您的 C++ CSS 会覆盖您在设计器视图中设置的内容。

在设计器视图中,只需对 styleSheet 属性使用类似的内容:

QPushButton { border-image: url(:/img/btn_mid_0.png); }
QPushButton::menu-indicator { image: none; }

或者 C++ 中的相同内容,但带有引号 :)

至于菜单样式...我不确定现在那里发生了什么(看起来很奇怪!)但是让它们的大小匹配的最简单方法是显式设置两者的大小,或者在 CSS(@ 987654323@) 或 C++ (QWidget::setFixedWidth(XXX))。如果按钮由布局管理,C++ 版本可能会更好,因为 CSS 大小属性会变得模糊。对于 CSS,有时 min-width 和/或 max-widthwidth 工作得更好。

【讨论】:

  • 问题已经解决了!非常感谢你!这个问题困扰了我三天。谢谢!
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2017-08-11
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多