【问题标题】:How to programmatically change style sheet of buttons in Qt?如何以编程方式更改 Qt 中按钮的样式表?
【发布时间】:2019-05-28 06:25:25
【问题描述】:

我的对话框上有很多按钮,我想在某些情况下更改它们的样式表。 按钮对象名称如下:
btn_1
btn_2
btn_3
..
btn_20


当我单击其中一个数字按钮,然后单击另一个简单按钮时,我想更改第一次单击的数字按钮样式表。如何访问该选定的数字按钮?

编辑: 我说的图片是什么意思


我正在尝试使用右列按钮设置左列按钮(具有数字排序的对象名称)的颜色。用户将首先点击数字按钮,然后点击颜色命名按钮。

【问题讨论】:

  • 该图形可以帮助您部分了解您的目标,但您可以更好地向您解释何时应该建立颜色。例如,如果你按下 btn_4 按钮,然后按下红色按钮,我猜 btn_4 应该设置为红色,现在如果你按下 btn_5,然后按下绿色按钮,我猜 btn_5 应该是绿色的,btn_4 会发生什么,应该保持红色还是应该重置?
  • 你点击了 btn_1 然后 red = btn_1 变红,其他的保留他们已经设置的内容

标签: c++ qt qt5 qtstylesheets qpushbutton


【解决方案1】:

您必须使用 setStyleSheet 方法,但您必须保持按下按钮的引用,这可以使用返回发出信号的对象的 sender 方法来完成。

#include <QtWidgets>

class MainWindow: public QMainWindow{
    Q_OBJECT
public:
    MainWindow(QWidget *parent=nullptr):
        QMainWindow(parent),
        current_button(nullptr)
    {
        QWidget *widget = new QWidget;
        setCentralWidget(widget);
        QHBoxLayout *hlay = new QHBoxLayout(widget);
        QVBoxLayout *number_lay = new QVBoxLayout;
        QVBoxLayout *color_lay = new QVBoxLayout;
        hlay->addLayout(number_lay);
        hlay->addLayout(color_lay);

        for(int i=0; i<20; i++){
            QPushButton *button = new QPushButton(QString("btn_%1").arg(i+1));
            connect(button, &QPushButton::clicked, this, &MainWindow::number_clicked);
            number_lay->addWidget(button);
        }
        color_lay->addStretch();
        for(const QString & colorname: {"Red", "Green", "Blue"}){
            QPushButton *button = new QPushButton(colorname);
            connect(button, &QPushButton::clicked, this, &MainWindow::color_clicked);
            color_lay->addWidget(button);
            button->setProperty("color", colorname.toLower());
            button->setStyleSheet(QString("background-color: %1").arg(colorname));
        }
        color_lay->addStretch();
    }
private slots:
    void number_clicked(){
        current_button = qobject_cast<QPushButton *>(sender());
    }
    void color_clicked(){
        if(current_button){
            QString colorname = sender()->property("color").toString();
            current_button->setStyleSheet(QString("background-color: %1").arg(colorname));
        }
    }
private:
    QPushButton *current_button;
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
#include "main.moc"

【讨论】:

    【解决方案2】:

    当你点击第一个按钮时,使用方法objectName()获取它的名字,然后当你需要改变样式时,只需在方法中指定

    setStyleSheet(QString(QPushButton#) + button-&gt;objectName() + QString("{ ... }");

    我可以写示例程序,但我不完全理解你想要什么

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2011-05-14
      • 2013-09-12
      相关资源
      最近更新 更多