QTextDocument: add manual test for table border logic

This adds a manual test for the QTextTable border logic.

Two HTML files are bundled as resources:

table-border-test.html: Contains various test cases for the border
logic.

table-border-test-header.html: Contains a test case for printing a table
with a repeated header.

The test application allows:
- editing
- previewing
- printing
- opening the HTML in the system browser (via temp. file)

It is possible to edit the HTML with "live preview" so new test cases
can easily be implemented.

Change-Id: Ic88488bc8b7dd74d5c03c3363f55840423462325
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
This commit is contained in:
Nils Jeisecke 2019-07-22 19:06:34 +02:00 committed by Shawn Rutledge
parent c595878aa3
commit 9c891bead8
9 changed files with 616 additions and 0 deletions

View File

@ -35,6 +35,7 @@ qsslsocket \
qsysinfo \
qtabletevent \
qtexteditlist \
qtexttableborders \
qtbug-8933 \
qtbug-52641 \
qtouchevent \

View File

@ -0,0 +1,39 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}

View File

@ -0,0 +1,10 @@
#This project can be used to verify QTBUG-36152 case.
QT += core gui printsupport
CONFIG += c++11
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qtexttableborders
TEMPLATE = app
SOURCES += main.cpp widget.cpp
HEADERS += widget.h
FORMS += widget.ui
RESOURCES += resources.qrc

View File

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file>table-border-test-header.html</file>
<file>table-border-test.html</file>
</qresource>
</RCC>

View File

@ -0,0 +1,129 @@
<html>
<body>
<h2>Printable table with repeated header</h2>
<p>
Please print (to PDF, save the trees) this table and compare this to the
print results of Chrome/Firefox.
<ul>
<li>Firefox fails to render the first repeated header correctly
<li>Chrome fails to render the Cell B top edge (should be red, except the first row after header
<li>Qt: Could do slightly better with the last row on each page (although both Firefox and Chrome don't work perfect here as well)
</ul>
</p>
<table border=1 bordercolor="#aaaaaa" style="border-collapse:collapse">
<thead>
<tr>
<th style="border-bottom: 1px solid blue">Header A</th>
<th style="border-bottom: 4px solid blue">Header B</th>
</tr>
</thead>
<tbody>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
<tr><td>Cell A</td><td style="border-top: 1px solid red">Cell B</td></tr>
</tbody>
</table>
</body>
</html>

View File

@ -0,0 +1,171 @@
<html>
<body>
<h1>Working Test Cases</h1>
<h2>border-collapse: separate</h2>
<h3>TC-A1: table no border</h3>
<table>
<tbody>
<tr>
<td>Cell 1A</td>
<td>Cell 1B</td>
</tr>
</tbody>
</table>
<h3>TC-A2: table attribute controlled border (1px, red)</h3>
<table border=1 bordercolor="red">
<tbody>
<tr>
<td>Cell 1A</td>
<td>Cell 1B</td>
</tr>
</tbody>
</table>
<h3>TC-A3: table attribute controlled border (4px, blue)</h3>
<table border=4 bordercolor="blue">
<tbody>
<tr>
<td>Cell 1A</td>
<td>Cell 1B</td>
</tr>
</tbody>
</table>
Note: Real browsers render the inner cells border with 1px, but QTextDocument's rendering has always been like this.
<h2>border-collapse: collapse</h2>
<h3>TC-B1: table no border</h3>
<table style="border-collapse: collapse">
<tbody>
<tr>
<td>Cell 1A</td>
<td>Cell 1B</td>
</tr>
</tbody>
</table>
<h3>TC-B2: table attribute + css controlled grid (outer border 1px)</h3>
<table border=1 bordercolor="red" style="border-collapse: collapse">
<tbody>
<tr>
<td>Cell 1A</td>
<td>Cell 1B</td>
</tr>
</tbody>
</table>
<h3>TC-B3: table attribute + css controlled grid (outer border 4px)</h3>
<table border=4 bordercolor="red" style="border-collapse: collapse">
<tbody>
<tr>
<td>Cell 1A</td>
<td>Cell 1B</td>
</tr>
</tbody>
</table>
<h3>TC-B4: table attribute + css controlled grid (one cell with custom edge)</h3>
<table border=4 bordercolor="red" style="border-collapse: collapse">
<tbody>
<tr>
<td>Cell 1A</td>
<td style="border-right: 8px solid green">Cell 1B (border-right: 8px solid green)</td>
</tr>
</tbody>
</table>
<h3>TC-B5: table with single decorated cell</h3>
<table style="border-collapse: collapse">
<tbody>
<tr>
<td>Cell 1A</td>
<td style="border: 2px solid red">Cell 1B (border: 2px solid red)</td>
</tr>
</tbody>
</table>
<h3>cells with competing rules</h3>
<h4>TC-C1: vertical edge (pink, 6px) wins over horizontal edge (red|blue, 6px)</h4>
<table border=1 bordercolor="#999999" style="border-collapse: collapse">
<tbody>
<tr>
<td style="border-right: 4px solid green; border-bottom: 6px solid red">Cell 1A</td>
<td style="border-left: 6px solid pink; border-bottom: 6px solid blue">Cell 2B</td>
</tr>
</tbody>
</table>
<h4>TC-C2: vertical edge (pink, 6px) loses over horizontal edge (red|blue, 8px)</h4>
<table border=1 bordercolor="#999999" style="border-collapse: collapse">
<tbody>
<tr>
<td style="border-right: 4px solid green; border-bottom: 8px solid red">Cell 1A</td>
<td style="border-left: 6px solid pink; border-bottom: 8px solid blue">Cell 2B</td>
</tr>
</tbody>
</table>
<h4>TC-C3: cells with span and competing rules</h4>
<table border=1 bordercolor="#999999" style="border-collapse: collapse">
<tbody>
<tr>
<td colspan=2 style="border-bottom: 4px solid red">Cell 1A/B spans over two columns (border-bottom: red)</td>
</tr>
<tr>
<td style="border-top: 1px solid green">Cell 2A (border-top loses -> red)</td>
<td style="border-top: 10px solid green">Cell 2B (border-top wins -> green)</td>
</tr>
</tbody>
</table>
<h1>Non-Working Test Cases</h1>
<h2>border-collapse: separate</h2>
<h3>TC-X1: table css border (red via style)</h3>
<table style="border: 1px solid red">
<tbody>
<tr>
<td>Cell 1A</td>
<td>Cell 1B</td>
</tr>
</tbody>
</table>
<h2>border-collapse: collapse</h2>
<h3>TC-X2: tr css border</h3>
<table border=1 style="border-collapse: collapse">
<tbody>
<tr style="border-bottom: 2px solid red">
<td>Cell 1A (border-bottom should be red)</td>
<td>Cell 1B (border-bottom should be red)</td>
</tr>
<tr style="border-left: 2px solid red">
<td>Cell 2A (border-left should be red)</td>
<td>Cell 2B</td>
</tr>
</tbody>
</table>
<h3>TC-X3: cells with competing rules and colspan</h3>
<table border=1 bordercolor="#999999" style="border-collapse: collapse">
<tbody>
<tr>
<td colspan=2 style="border-bottom: 4px solid red; border-right: 15px solid pink">Cell 1A/B spans over two columns (border-bottom: red, border-right pink)</td>
</tr>
<tr>
<td style="border-top: 1px solid green">Cell 2A (border-top loses -> red)</td>
<td style="border-top: 10px solid green">Cell 2B (border-top wins -> green)</td>
</tr>
</tbody>
</table>
This is currently not 100% correct but admittedly a constructed corner case (and Chrome failes here, too).
</body>
</html>

View File

@ -0,0 +1,125 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "widget.h"
#include "ui_widget.h"
#include <QScrollBar>
#include <QFile>
#include <QDir>
#include <QTemporaryFile>
#ifndef QT_NO_DESKTOPSERVICES
#include <QDesktopServices>
#endif
#ifndef QT_NO_PRINTER
#include <QPrinter>
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#endif
// This manual test allows checking the QTextTable border logic (QTBUG-36152)
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
resize(1400, 800);
connect(ui->docComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::onDocumentSelected);
connect(ui->printButton, &QPushButton::clicked, this, &Widget::onPrint);
connect(ui->previewButton, &QPushButton::clicked, this, &Widget::onPreview);
connect(ui->openBrowserButton, &QPushButton::clicked, this, &Widget::onOpenBrowser);
connect(ui->sourceEdit, &QTextEdit::textChanged, this,
[this]() {
// make this a world class HTML IDE
auto pos = ui->htmlEdit->verticalScrollBar()->value();
ui->htmlEdit->setHtml(ui->sourceEdit->toPlainText());
ui->htmlEdit->verticalScrollBar()->setValue(pos);
});
ui->docComboBox->addItem(tr("Table Border Test"), ":/table-border-test.html");
ui->docComboBox->addItem(tr("Table Border Header Test"), ":/table-border-test-header.html");
ui->docComboBox->setCurrentIndex(0);
}
Widget::~Widget()
{
delete ui;
}
void Widget::onDocumentSelected()
{
QString url = ui->docComboBox->itemData(ui->docComboBox->currentIndex()).toString();
QFile f(url);
if (f.open(QFile::ReadOnly)) {
ui->sourceEdit->setPlainText(QString::fromUtf8(f.readAll()));
// preview HTML is set via textChanged signal
}
}
void Widget::onPrint()
{
#ifndef QT_NO_PRINTER
QPrinter printer(QPrinter::HighResolution);
QPrintDialog dlg(&printer, this);
if (ui->htmlEdit->textCursor().hasSelection())
dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
dlg.setWindowTitle(tr("Print Document"));
if (dlg.exec() == QDialog::Accepted) {
ui->htmlEdit->print(&printer);
}
#endif
}
void Widget::onPreview()
{
#ifndef QT_NO_PRINTER
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog preview(&printer, this);
connect(&preview, &QPrintPreviewDialog::paintRequested, ui->htmlEdit, &QTextEdit::print);
preview.exec();
#endif
}
void Widget::onOpenBrowser()
{
// write the current html to a temp file and open the system browser
#ifndef QT_NO_DESKTOPSERVICES
auto tf = new QTemporaryFile(QDir::tempPath() + "/XXXXXX.html", this);
if (tf->open()) {
tf->write(ui->sourceEdit->toPlainText().toUtf8());
tf->close();
QDesktopServices::openUrl(QUrl::fromLocalFile(tf->fileName()));
}
#endif
}

View File

@ -0,0 +1,56 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void onDocumentSelected();
void onPrint();
void onPreview();
void onOpenBrowser();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>606</width>
<height>522</height>
</rect>
</property>
<property name="windowTitle">
<string>QTextTable Border Manual Test</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="docComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="printButton">
<property name="text">
<string>Print</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="previewButton">
<property name="text">
<string>Preview</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="openBrowserButton">
<property name="text">
<string>Open Browser</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QSplitter" name="splitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTextEdit" name="htmlEdit"/>
<widget class="QTextEdit" name="sourceEdit"/>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<tabstops>
<tabstop>docComboBox</tabstop>
<tabstop>printButton</tabstop>
<tabstop>previewButton</tabstop>
<tabstop>openBrowserButton</tabstop>
<tabstop>htmlEdit</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>