我正在使用Qt设计师创建一组32个状态"灯。"我的灯是QLabels。因此,将我的空白Qlabel初始化为黄色样式表,然后根据布尔数据的文本文件输入将每个灯设置为红色或绿色。我的问题是,每次我必须硬编码,因为设计器语法是ui-> color_0-> setStyleSheet(" background-color:rgb(0,255,0);");
color_0,color_1等是QLabel对象。我想编写一个for循环并将循环增量器连接(追加)到颜色,但这不起作用,因为它不是QLabel类型。下面的代码,让我知道如何清理此代码并使其更有效。
stats
} //结束按钮点击
答案 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)
#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位值。