【问题标题】:Change background color of a Qlayout containing QButtons更改包含 QButtons 的 Qlayout 的背景颜色
【发布时间】:2018-08-29 14:01:23
【问题描述】:

我有这个 Qt 代码:

QHBoxLayout *taggerBox = new QHBoxLayout;
falseBtn = new QToolButton;
falseBtn->setText(tr("False"));
voidBtn = new QToolButton;
voidBtn->setText(tr("Void"));
taggerBox->addWidget(falseBtn);
taggerBox->addWidget(voidBtn);

我想更改 QHBoxLayout 的背景(不是每个按钮的背景)。我没有找到任何方法来更改 QLayout 的背景颜色。

我该怎么做?

谢谢!

【问题讨论】:

    标签: c++ qt qt5


    【解决方案1】:

    QLayout 不是视觉元素,它是一个容器,可以调整包含的小部件的位置。您可以更改 QFrame 或您包含 QLayout 的其他小部件的背景。

    【讨论】:

      【解决方案2】:

      由于QHBoxLayout 不是QWidget,它没有自己的外观。所以你不能改变它的颜色。

      【讨论】:

        【解决方案3】:

        您必须添加一个设置布局的中间小部件,并更改该小部件的背景。例如

        auto *taggerBox = new QWidget;
        auto *layout = new QHBoxLayout(taggerbox);
        falseBtn = new QToolButton(tr("False"));
        voidBtn = new QToolButton(tr("Void"));
        layout->addWidget(falseBtn);
        layout->addWidget(voidBtn);
        auto palette = taggerBox->palette();
        palette.setColor(QPalette::Window, Qt::blue);
        taggerBox->setPalette(palette);
        

        如果您在某个类的构造函数中执行此操作,那么这些对象可能与该类具有相同的生命周期,因为没有必要动态分配它们。在这种情况下,小部件和布局应该是类成员:

        class MyClass : ... {
          QWidget taggerBox;
          QHBoxLayout taggerLayout{&taggerBox};
          QToolButton falseBtn{tr("False")};
          QToolButton voidBtn{tr("Void")};
        public:
          MyClass(...);
        };
        
        MyClass::MyClass(...) : ... {
            taggerLayout.addWidget(&falseBtn);
            taggerLayout.addWidget(&voidBtn);
            auto palette = taggerBox.palette();
            palette.setColor(QPalette::Window, Qt::blue);
            taggerBox.setPalette(palette);
            ...
        }
        

        【讨论】:

        • 静态成员可能不再在 Qt 4.8 及更高版本中正常工作,因为这意味着可能存在析构炸弹或尝试调用被破坏对象的成员。问题是 Qt 会自动删除子小部件和拥有的布局。问题是如果对象通过调用框架外的析构函数而被销毁,消息泵可能在销毁后仍会处理它。更可能是复杂的 GUI,其中一些元素由计时器、来自其他线程的消息等更新。
        • 这不是真的。我不知道您所说的“破坏性炸弹”是什么意思。 Qt 只删除存在的孩子。如果你摆脱了一个孩子,那么它就不存在了,如果 Qt 试图弄乱不再存在的孩子,它就会非常被破坏。由于 C++ 几十年来已经指定了类成员的构造和销毁顺序,因此以正确的方式对成员进行排序并不难。我总共有几十万行项目,都是这样写的。
        • 没有“调用框架外的析构函数”之类的东西——我的意思是继续:尝试提供一个示例(代码,而不是文字)。不知道这甚至意味着什么。 Qt 对象,如 QObject,只是 C++ 类,以及适当的 RAII 类。它们可以在任何时候被任何人销毁,并且当它们被销毁时,它们会擦除任何为自己挂起的事件,以及对自己的任何引用。 Qt 有大约 1k 行代码来处理各种极端情况是有原因的。
        • 与拥有对象具有相同生命周期的所有成员对象都应按值保存,通过 Qt 不会(也不能!)改变的 C++ 语义。如果一个对象的生命周期在拥有对象的生命周期之前结束 - 那么它确实不能被裸值持有。 std::optional 适用于此,或通过智能指针或通过父对象显式动态分配。
        • 你实际上之前就这个观点被点名过。给出的示例之一是本文的链接:wiki.qt.io/Threads_Events_QObjects 当涉及消息循环时,即使您不将它们放入类中,小部件的私有实现也拥有其子级。强制它们被类析构函数销毁会强制执行特定的顺序。从树中删除小部件会自动强制框架尝试/删除其子项。如果顺序不同怎么办?另外,平台将如何处理双重删除?这并不适用于所有平台,我自己看到的。
        猜你喜欢
        • 2015-05-07
        • 2023-03-14
        • 2019-05-22
        • 2022-01-06
        • 1970-01-01
        • 2013-08-08
        相关资源
        最近更新 更多