首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt设计器--设置样式表--现在硬编码--想要以编程方式设置

Qt设计器--设置样式表--现在硬编码--想要以编程方式设置
EN

Stack Overflow用户
提问于 2016-12-13 04:52:39
回答 3查看 924关注 0票数 0

我正在使用Qt designer创建一组32个状态的“灯光”。我的灯是QLabels的。因此,将我的空白Qlabel初始化为一个黄色样式表,然后根据布尔数据的文本文件输入将每个光设置为红色或绿色。我的问题是,每次我必须硬编码它,因为设计器语法是ui->color_0->setStyleSheet("background-color: rgb(0,255,0);");

color_0、color_1等都是QLabel对象。我想写一个for循环,并将循环增量连接(附加)到颜色,但这不起作用,因为它不是QLabel类型。下面的代码,让我知道你将如何清理这段代码,使它更有效率。

代码语言:javascript
复制
void static2::on_pushButtonNext_clicked()
{
if (incrementer == 0)
{
    int tot_size = text.size();
    const char *str;  
    QByteArray array; //http://www.qtcentre.org/threads/22711-Converting-QString-to-char-array
    array = text.toLatin1();
    str = array.data();
}

//write an if statement here that prevents from running past the total stream. run if less than num_events_dec to end.
if (incrementer*num_events_dec <= tot_size - num_events_dec)
{
    incrementer++;
    ui->lcdNumber->display(incrementer);  //updates display

    int step = (incrementer-1)*num_events_dec; //this is the code that goes bit by bit on the stream
    for (int i = step; i < step+num_events_dec; i++){

        //PLACE COLOR SETTING COMMANDS HERE
        //http://stackoverflow.com/questions/2749798/qlabel-set-color-of-text-and-background
        //http://www.qtcentre.org/archive/index.php/t-5944.html

        if (str[i] == '1'){
            //make label background green

            //qDebug() << "high";

            //QLabel* color = new QLabel; //[num_events_dec]; //allocates an array of objects called color which is of the user specified size

            /*QString color = "color_" + QString::number(i);
            qDebug() << i;
            qDebug() << color;
             */

            /* As of right now i have string values that are of the proper name
             * I need those same names as Qlabels in order for ui->xxx to recognize them
             * The class mainwindow has an object ui which has an object called color_[i]
             */

            //ui->color->setStyleSheet("background-color: rgb(0, 255, 0);");
            switch (i-step){
            case 0: ui->color_0->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 1: ui->color_1->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 2: ui->color_2->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 3: ui->color_3->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 4: ui->color_4->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 5: ui->color_5->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 6: ui->color_6->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 7: ui->color_7->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 8: ui->color_8->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 9: ui->color_9->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 10: ui->color_10->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 11: ui->color_11->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 12: ui->color_12->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 13: ui->color_13->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 14: ui->color_14->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 15: ui->color_15->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 16: ui->color_16->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 17: ui->color_17->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 18: ui->color_18->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 19: ui->color_19->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 20: ui->color_20->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 21: ui->color_21->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 22: ui->color_22->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 23: ui->color_23->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 24: ui->color_24->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 25: ui->color_25->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 26: ui->color_26->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 27: ui->color_27->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 28: ui->color_28->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 29: ui->color_29->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 30: ui->color_30->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            case 31: ui->color_31->setStyleSheet("background-color: rgb(0, 255, 0);"); break;
            } //end switch case
         } //end if

        else if (str[i] == '0'){
            //make label background red

            //qDebug() << "low";

            switch (i-step){
            case 0: ui->color_0->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 1: ui->color_1->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 2: ui->color_2->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 3: ui->color_3->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 4: ui->color_4->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 5: ui->color_5->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 6: ui->color_6->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 7: ui->color_7->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 8: ui->color_8->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 9: ui->color_9->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 10: ui->color_10->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 11: ui->color_11->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 12: ui->color_12->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 13: ui->color_13->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 14: ui->color_14->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 15: ui->color_15->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 16: ui->color_16->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 17: ui->color_17->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 18: ui->color_18->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 19: ui->color_19->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 20: ui->color_20->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 21: ui->color_21->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 22: ui->color_22->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 23: ui->color_23->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 24: ui->color_24->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 25: ui->color_25->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 26: ui->color_26->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 27: ui->color_27->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 28: ui->color_28->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 29: ui->color_29->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 30: ui->color_30->setStyleSheet("background-color: rgb(255, 0, 0);"); break;
            case 31: ui->color_31->setStyleSheet("background-color: rgb(255, 0, 0);"); break;

            } //end switch case

        } //end else if

        else {
            QMessageBox::warning(this,"Error", "A non-binary number has been read -- Check input stream");

        } //end else
    } //end for loop
} //end if

else  //dont allow to increment
{
    QMessageBox::warning(this,"Error", "Stream Ended, No more data to view");
} //end else

}//结束按钮点击

EN

回答 3

Stack Overflow用户

发布于 2016-12-13 05:14:56

您可以将标签的背景设置为调色板角色,然后通过调色板轻松操作它。例如,在每个标签上设置以下样式表:

代码语言:javascript
复制
"background-color: window"

然后,您可以通过调色板设置标签的背景色:

代码语言:javascript
复制
void MyWidget::setColor(QWidget *w, const QColor &c) {
  pal = w->palette();
  pal.setBrush(QPalette::Window, {c});
  w->setPalette(pal);
}

您还可以按名称查找子小部件,从而避免显式访问ui成员的字段的重复代码:

代码语言:javascript
复制
QWidget *MyWidget::getColor(int n) {
  return qobject_cast<QWidget*>(findChild(QStringLiteral("color_%1").arg(n)));
}

因此,您的两个大开关简化为:

代码语言:javascript
复制
void MyWidget::setColorState(int n, QChar c) {
  auto widget = getColor(n);
  if (!widget) return;
  setColor(widget, c == QLatin1Char('1') ? Qt::green :
                   c == QLatin1Char('0') ? Qt::red : 
                                           Qt::black);
}

然后,要从二进制字符串中获取这些字符串:

代码语言:javascript
复制
void MyWidget::setColors(const QString &str) {
  int i = 0;
  for (i < str.length() && i < 32; ++i) {
    if (str[i] != QLatin1Char('1') && str[i] != QLatin1Char('0'))
      qWarning() << "str contains non-binary digit:" << str;
    setColorState(i, str[i]);
  }
  for (i < 32; ++i)
    setColorState(i, ' ');
}

你不应该通过消息向用户报告代码中的逻辑错误。请改用qWarning()

您也不必将字符串从QString转换为QByteArray。这毫无意义。

票数 1
EN

Stack Overflow用户

发布于 2016-12-13 05:28:10

如果你愿意,你也可以有一个哈希表。如果您想使用样式表而不是kubas answer,下面是一个示例。

代码语言:javascript
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    void customize(QLabel* label,QString color);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    QHash<int,QLabel*> hash;
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    hash[1] = ui->label_1;
    hash[2] = ui->label_2;
    hash[3] = ui->label_3;

}

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

void MainWindow::customize(QLabel *label, QString color)
{
    QString colorstring("background-color:");
    colorstring.append(color);
    colorstring.append(";");
    label->setStyleSheet(colorstring);
}


void MainWindow::on_pushButton_clicked()
{
    QString color("rgb(255,0,0)");
    customize(hash[1],color);
}

void MainWindow::on_pushButton_2_clicked()
{
    QString color("rgb(0,255,0)");
    customize(hash[1],color);
}
票数 0
EN

Stack Overflow用户

发布于 2016-12-14 02:54:22

最简单的方法可能是在包含的小部件上设置一个样式表,然后使用动态属性来打开或关闭每个小部件,如下所示:

代码语言:javascript
复制
#include <QApplication>
#include <QBoxLayout>
#include <QLabel>
#include <QSpinBox>
#include <QStyle>
#include <QWidget>

#include <array>

class BinaryIndicator : public QWidget
{
    Q_OBJECT
    Q_DISABLE_COPY(BinaryIndicator)

    std::array<QLabel*, 32> labels;

public:
    BinaryIndicator(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        setStyleSheet("QLabel[state='on']  { background-color: red; }"
                      "QLabel[state='off'] { background-color: green; }");

        auto layout = new QHBoxLayout();
        for (auto& l: labels) {
            l = new QLabel(this);
            layout->addWidget(l);
        }
        setLayout(layout);
        setValue(0);
    }

public slots:
    void setValue(uint32_t value)
    {
        int i = 32;
        for (auto *label: labels) {
            label->setProperty("state", value & 1<<--i ? "on" : "off");
            // we need to re-polish the widget to pick up the changed
            // style selector
            label->style()->unpolish(label);
            label->style()->polish(label);
        }
    }
};  

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QWidget w;
    auto layout = new QVBoxLayout();
    w.setLayout(layout);
    auto indicator = new BinaryIndicator(&w);
    layout->addWidget(indicator);
    auto spinbox = new QSpinBox(&w);
    spinbox->setRange(0, 0x7fffffff);
    layout->addWidget(spinbox);
    QObject::connect<void(QSpinBox::*)(int)>(spinbox, &QSpinBox::valueChanged, indicator, &BinaryIndicator::setValue);
    w.show();
    app.exec();
}

#include "41109349_moc.cpp"

请注意,我们必须重新打磨小部件,使其与属性的新值相匹配-请参阅changing stylesheet dynamically。此外,QSpinBox仅限于带符号的32位值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41109349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档