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

时间:2016-12-12 20:52:39

标签: c++ qt qt-creator qt-designer

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

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

stats

} //结束按钮点击

3 个答案:

答案 0 :(得分:1)

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

"background-color: window"

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

void MyWidget::setColor(QWidget *w, const QColor &c) {
  pal = w->palette();
  pal.setBrush(QPalette::Window, {c});
  w->setPalette(pal);
}

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

QWidget *MyWidget::getColor(int n) {
  return qobject_cast<QWidget*>(findChild(QStringLiteral("color_%1").arg(n)));
}

因此,你的两个大开关减少到:

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

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

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 :(得分:0)

如果你愿意的话,你也可以有一个哈希表。这是一个例子,如果你想使用样式表而不是kubas答案。

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

答案 2 :(得分:0)

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

  select {
display: inline !important;
height: 15px !important;

请注意,我们必须重新修改窗口小部件,使其与属性的新值匹配 - 请参阅changing stylesheet dynamically。此外,#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" 仅限于带符号的32位值。