0

我在我的QWidget. 在那个小部件中,我称之为QDialog. 该对话框出现在默认调色板中,它是浅色的。

这是我的自定义对话框(在这种情况下用于为调色板选择颜色!扭曲吧?).cpp文件:

#include "custompalettedialog.h"

CustomPaletteDialog::CustomPaletteDialog(QPalette palette, QWidget *parent) : QDialog(parent),
    m_palette(palette)
{
    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    mainLayout->setSpacing(0);
    mainLayout->setMargin(0);
    QFormLayout* mainFormLayout = new QFormLayout;
    mainFormLayout->setHorizontalSpacing(0);
    mainFormLayout->setVerticalSpacing(0);
    mainLayout->addLayout(mainFormLayout);

    for (int var = 0; var < QPalette::ColorRole::NColorRoles; ++var) {
        QPushButton* bandButton = new QPushButton;
        bandButton->setFlat(true);
        bandButton->setAutoFillBackground(true);
        QPalette pal = bandButton->palette();
        pal.setColor(QPalette::Button, m_palette.color(static_cast<QPalette::ColorRole>(var)));
        bandButton->setPalette(pal);
        connect(bandButton, &QPushButton::clicked, this, [this, bandButton, var]() {
            QColor color = QColorDialog::getColor();
            if (color.isValid()) {
                m_palette.setColor(static_cast<QPalette::ColorRole>(var), color);
                QPalette pal = bandButton->palette();
                pal.setColor(QPalette::Button, color);
                bandButton->setPalette(pal);
            }
        });
        mainFormLayout->addRow(QVariant::fromValue(static_cast<QPalette::ColorRole>(var)).toString(), bandButton);
    }

    QPushButton* doneButton = new QPushButton("Done");
    connect(doneButton, &QPushButton::clicked, this, &QDialog::accept);
    mainLayout->addWidget(doneButton);
}

QPalette CustomPaletteDialog::getPalette()
{
    return m_palette;
}

QPalette CustomPaletteDialog::getPalette(bool* ok, const QPalette palette, QWidget *parent, const QString title)
{
    CustomPaletteDialog* dialog = new CustomPaletteDialog(palette, parent);
    dialog->setFont(parent->font());
    dialog->setModal(true);
    dialog->setWindowTitle(title);
    dialog->exec();
    QPalette pal = dialog->getPalette();
    *ok = dialog->result();
    dialog->deleteLater();
    return pal;
}

.h文件:

#ifndef CUSTOMPALETTEDIALOG_H
#define CUSTOMPALETTEDIALOG_H

#include <QDialog>
#include <QFormLayout>
#include <QPushButton>
#include <QLineEdit>
#include <QColorDialog>
#include <QComboBox>

class CustomPaletteDialog : public QDialog
{
    Q_OBJECT
public:
    explicit CustomPaletteDialog(QPalette palette, QWidget *parent = nullptr);
    static QPalette getPalette(bool* ok, const QPalette palette, QWidget *parent = nullptr, const QString title = QString());
    QPalette getPalette();
private:
    QPalette m_palette;
};

#endif // CUSTOMPALETTEDIALOG_H

getPalette我从父小部件调用静态方法。我试过添加这个:

dialog->setPalette(parent->palette());

之前dialog->setFont(parent->font());在那个静态方法中并且不起作用。我的问题是如何将 QPalette 从父 QWidget 传播到子 QDialog?

这就是我使用它的方式:

QPushButton* paletteAddButton = new QPushButton("Add...");
mainGroupBoxLayout->addWidget(paletteAddButton);
connect(paletteAddButton, &QPushButton::clicked, this, [this, customThemeItemModel]() {
    bool ok = false;
    QPalette palette = CustomPaletteDialog::getPalette(&ok, this->palette(), this, "Chosse UI Palette");
    if (ok) {
        QStandardItem* item = new QStandardItem("newPalette");
        item->setToolTip("Double Click to Change Name, Right Click for More");
        item->setData(palette);
        customThemeItemModel->appendRow(item);
        saveThemes(customThemeItemModel);
    }
});

我有一个主题列表,用户可以将自定义主题添加到该列表中。

4

0 回答 0