QMessageBox с форматированием макета HTML

Для моей программы я делаю QMessageBox для раздела about и импортирую html-файл, чтобы установить макет указанного поля:

// Program.cpp
QMessageBox about;
about.setWindowTitle(tr("About"));

// Enable the HTML format.
about.setTextFormat(Qt::RichText);

// Getting the HTML from the file
std::ifstream file("html/about.html");
std::string html, line;

if (file.is_open())
{
    while (std::getline(file, line))
        html += line;
}

about.setText(html.c_str());
about.exec();

И about.html выглядит так:

<!-- about.html -->
<div>
     <h1>The Program</h1>
     <p> Presentation </p>
     <p> Version : 0.1.2 </p>
     <p> <a href="www.wipsea.com">User Manual</a> </p>
     <h4>Licence Agreement</h4>
     <p style="border: 1px solid black; overflow: y;">
        Law thingy, bla and also bla, etc ...
     </p>
</div>

Проблема в том, что я не знаю, что можно, а что нельзя.

Например, я хочу поместить лицензионное соглашение в текстовую область с рамкой и переполнением. H1 и h4 работают, а стиль лицензионного соглашения — нет.

Таким образом, лицензионное соглашение представляет собой простой текст.

Есть ли способ стилизовать html в QMessageBox?


person Romain    schedule 07.08.2014    source источник
comment
Я считаю, что окна сообщений лучше подходят для коротких сообщений (текстов). Если вам нужно показать расширенный текст, например лицензионное соглашение, я думаю, что лучше использовать QTextEdit.   -  person vahancho    schedule 07.08.2014


Ответы (1)


QMessageBox — это просто удобный класс, который не предлагает эту функциональность. Вам нужно будет построить свой собственный диалог:

class HTMLMessageBox : public QDialog
{
    Q_OBJECT
public:
    explicit HTMLMessageBox(QWidget *parent = 0);

    void setHtml(QString html);

private:
    QTextEdit *m_textEdit;
};


HTMLMessageBox::HTMLMessageBox(QWidget *parent) :
    QDialog(parent)
{
    m_textEdit = new QTextEdit(this);
    m_textEdit->setAcceptRichText(true);

    QPushButton *okButton = new QPushButton(tr("Ok"));
    searchButton->setDefault(true);

    QPushButton *cancelButton = new QPushButton(tr("Cancel"));

    QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal);
    buttonBox->addButton(searchButton, QDialogButtonBox::AcceptRole);
    buttonBox->addButton(cancelButton, QDialogButtonBox::RejectRole);

    connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
    connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));

    QVBoxLayout *lt = new QVBoxLayout;
    lt->addWidget(m_textEdit);
    lt->addWidget(buttonBox);

    setLayout(lt);
}

void HTMLMessageBox::setHtml(QString html)
{
    m_textEdit->setHtml(html);
}
person Nejat    schedule 07.08.2014
comment
Это все еще не делает то, что я ожидаю. TextEdit HTML находится в контейнере с переполнением, но содержит весь HTML. Кроме того, для лицензионного корпуса нет границ. TextEdit не лучше анализирует HTML. - person Romain; 07.08.2014