- better UI

This commit is contained in:
dmytro.bogovych 2019-05-12 19:06:23 +03:00
parent 13e00590b1
commit 7cc4ce2b94
8 changed files with 459 additions and 252 deletions

View File

@ -1,14 +1,28 @@
#include "connectdb_widget.h" #include "connectdb_widget.h"
#include "ui_connectdb_widget.h" #include "ui_connectdb_widget.h"
ConnectDbWidget::ConnectDbWidget(QWidget *parent) : ConnectDbWidget::ConnectDbWidget(const QString& message, QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::ConnectDbWidget) ui(new Ui::ConnectDbWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->mMessageLabel->setText(message);
connect(ui->mButtonBox, SIGNAL(accepted()), this, SLOT(onOk()));
connect(ui->mButtonBox, SIGNAL(rejected()), this, SLOT(onCancel()));
connect(ui->mPasswordEdit, SIGNAL(returnPressed()), this, SLOT(onOk()));
} }
ConnectDbWidget::~ConnectDbWidget() ConnectDbWidget::~ConnectDbWidget()
{ {
delete ui; delete ui;
} }
void ConnectDbWidget::onOk()
{
emit passwordEntered(ui->mPasswordEdit->text());
}
void ConnectDbWidget::onCancel()
{
emit cancelled();
}

View File

@ -12,11 +12,19 @@ class ConnectDbWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit ConnectDbWidget(QWidget *parent = nullptr); explicit ConnectDbWidget(const QString& msg = QString(), QWidget *parent = nullptr);
~ConnectDbWidget(); ~ConnectDbWidget();
private: private:
Ui::ConnectDbWidget *ui; Ui::ConnectDbWidget *ui;
public slots:
void onOk();
void onCancel();
signals:
void passwordEntered(const QString& password);
void cancelled();
}; };
#endif // CONNECTDB_WIDGET_H #endif // CONNECTDB_WIDGET_H

View File

@ -10,10 +10,35 @@
<height>114</height> <height>114</height>
</rect> </rect>
</property> </property>
<property name="minimumSize">
<size>
<width>200</width>
<height>100</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>400</width>
<height>150</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="mMessageLabel">
<property name="text">
<string/>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item> <item>
<widget class="QLabel" name="mPasswordLabel"> <widget class="QLabel" name="mPasswordLabel">
<property name="text"> <property name="text">
@ -25,7 +50,14 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="mPasswordEdit"/> <widget class="QLineEdit" name="mPasswordEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item> </item>
<item> <item>
<widget class="QDialogButtonBox" name="mButtonBox"> <widget class="QDialogButtonBox" name="mButtonBox">

View File

@ -26,13 +26,17 @@
#include "finddialog.h" #include "finddialog.h"
#include "startworkdialog.h" #include "startworkdialog.h"
#include "stopworkdialog.h" #include "stopworkdialog.h"
#include "connectdb_widget.h"
#include "openorcreatedb_widget.h"
#include <QDesktopWidget> #include <QDesktopWidget>
#include <iostream>
#define SETTINGS mSettings->data() #define SETTINGS mSettings->data()
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
ui(new Ui::MainWindow), mPasswordFailed(false), mFindInTasksDlg(this), mDockRecentMenu(nullptr) mPasswordFailed(false), mFindInTasksDlg(this), mDockRecentMenu(nullptr)
{ {
mSettings = QSharedPointer<Settings>(new Settings()); mSettings = QSharedPointer<Settings>(new Settings());
@ -47,21 +51,30 @@ MainWindow::MainWindow(QWidget *parent) :
mCurrentIntervalLabel = nullptr; mCurrentIntervalLabel = nullptr;
mTrayIcon = nullptr; mTrayIcon = nullptr;
ui->setupUi(this);
// Hide Find line edit for now
ui->mFindFrame->setVisible(false);
helper::EscapeKeyEventFilter* eventFilter = new helper::EscapeKeyEventFilter(ui->mFindEdit);
connect(eventFilter, SIGNAL(escapePressed(QObject*)), this, SLOT(findRejected(QObject*)));
ui->mFindEdit->installEventFilter(eventFilter);
QCoreApplication::setApplicationName(APPNAME); QCoreApplication::setApplicationName(APPNAME);
//QCoreApplication::setOrganizationName(COMPANY);
// Set this to your own appcast URL, of course
FvUpdater::sharedUpdater()->SetFeedURL("http://satorilight.com/LittAppCast.xml");
initClient(); loadGeometry();
QApplication::postEvent(this, new AttachDatabaseEvent());
// Now check if database is already configured
QWidget* centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
centralWidget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
// Check if database file exists
QString path = helper::path::pathToDatabase();
if (mSettings->data()[KEY_DB_FILENAME_SPECIFIED].toBool())
path = mSettings->data()[KEY_DB_FILENAME].toString();
QString folder = QFileInfo(path).absoluteDir().path();
Storage::instance().setPath(path);
if (!QFile::exists(path))
askNewDbPassword();
else
askDbPassword(QString());
this->setUpdatesEnabled(true);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -75,12 +88,14 @@ void MainWindow::attachDatabase()
{ {
// Open database // Open database
QString path = helper::path::pathToDatabase(); QString path = helper::path::pathToDatabase();
if (mSettings->data()[KEY_DB_FILENAME_SPECIFIED].toBool()) if (mSettings->data()[KEY_DB_FILENAME_SPECIFIED].toBool())
path = mSettings->data()[KEY_DB_FILENAME].toString(); path = mSettings->data()[KEY_DB_FILENAME].toString();
QString folder = QFileInfo(path).absoluteDir().path(); QString folder = QFileInfo(path).absoluteDir().path();
Storage::instance().setPath(path); Storage::instance().setPath(path);
/*
if (!QFile::exists(path)) if (!QFile::exists(path))
{ {
QDir().mkpath(folder); QDir().mkpath(folder);
@ -93,7 +108,6 @@ void MainWindow::attachDatabase()
else else
{ {
// See if there is stored password // See if there is stored password
QString password;
if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool() && mSettings->data()[KEY_PASSWORD].toString() != NOPASSWORDSTRING) if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool() && mSettings->data()[KEY_PASSWORD].toString() != NOPASSWORDSTRING)
password = mSettings->data()[KEY_PASSWORD].toString(); password = mSettings->data()[KEY_PASSWORD].toString();
else else
@ -102,26 +116,10 @@ void MainWindow::attachDatabase()
connect(mPasswordDlg, SIGNAL(finished(int)), this, SLOT(passwordDialogFinished(int))); connect(mPasswordDlg, SIGNAL(finished(int)), this, SLOT(passwordDialogFinished(int)));
mPasswordDlg->show(); mPasswordDlg->show();
} }
} }*/
this->setUpdatesEnabled(true); this->setUpdatesEnabled(true);
} }
void MainWindow::openDatabase(const QString &password)
{
Storage::instance().setKey(password);
if (!Storage::instance().open())
{
mPasswordFailed = true;
alertBox(tr("Error"), tr("Failed to open database"), AlertType_CannotOpen);
}
else
if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool())
{
mSettings->data()[KEY_PASSWORD] = password;
mSettings->save();
}
}
void MainWindow::connectUiToDatabase() void MainWindow::connectUiToDatabase()
{ {
ui->mTaskTree->setModel(mTaskTreeModel = new TaskTreeModel(false)); ui->mTaskTree->setModel(mTaskTreeModel = new TaskTreeModel(false));
@ -172,10 +170,6 @@ void MainWindow::alertBox(const QString &title, const QString &text, AlertType a
connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(criticalAlertFinished(int))); connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(criticalAlertFinished(int)));
break; break;
case AlertType_CannotOpen:
connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(openAlertFinished(int)));
break;
case AlertType_Warning: case AlertType_Warning:
connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(warningAlertFinished(int))); connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(warningAlertFinished(int)));
break; break;
@ -293,7 +287,7 @@ void MainWindow::save()
QSharedPointer<QByteArray> MainWindow::getUndoStack() const QSharedPointer<QByteArray> MainWindow::getUndoStack() const
{ {
QTextDocument* doc = ui->mNoteEdit->document(); //QTextDocument* doc = ui->mNoteEdit->document();
return QSharedPointer<QByteArray>(new QByteArray()); return QSharedPointer<QByteArray>(new QByteArray());
} }
@ -356,7 +350,7 @@ void MainWindow::loadGeometry()
} }
// Set splitter position // Set splitter position
if (settings.contains(KEY_SPLITTEROFFSET1) && settings.contains(KEY_SPLITTEROFFSET2)) if (settings.contains(KEY_SPLITTEROFFSET1) && settings.contains(KEY_SPLITTEROFFSET2) && ui)
{ {
QList<int> sizes = ui->mSplitter->sizes(); QList<int> sizes = ui->mSplitter->sizes();
sizes[0] = settings.value(KEY_SPLITTEROFFSET1).toInt(); sizes[0] = settings.value(KEY_SPLITTEROFFSET1).toInt();
@ -364,7 +358,7 @@ void MainWindow::loadGeometry()
ui->mSplitter->setSizes(sizes); ui->mSplitter->setSizes(sizes);
} }
if (settings.contains(KEY_TIMESPLITTER_OFFSET1) && settings.contains(KEY_TIMESPLITTER_OFFSET2)) if (settings.contains(KEY_TIMESPLITTER_OFFSET1) && settings.contains(KEY_TIMESPLITTER_OFFSET2) && ui)
{ {
QList<int> sizes = ui->mTimeSplitter->sizes(); QList<int> sizes = ui->mTimeSplitter->sizes();
sizes[0] = settings.value(KEY_TIMESPLITTER_OFFSET1).toInt(); sizes[0] = settings.value(KEY_TIMESPLITTER_OFFSET1).toInt();
@ -380,6 +374,8 @@ void MainWindow::sync()
void MainWindow::closeEvent(QCloseEvent * ev) void MainWindow::closeEvent(QCloseEvent * ev)
{ {
if (ui)
{
// Update DB if document was modified // Update DB if document was modified
if (ui->mNoteEdit->document()->isModified()) if (ui->mNoteEdit->document()->isModified())
{ {
@ -395,7 +391,7 @@ void MainWindow::closeEvent(QCloseEvent * ev)
if (!mPasswordFailed) if (!mPasswordFailed)
save(); save();
}
ev->accept(); ev->accept();
} }
@ -804,6 +800,56 @@ void MainWindow::updateAttachmentsLabel(PTask t)
mAttachmentsLabel->setText(text); mAttachmentsLabel->setText(text);
} }
void MainWindow::setupMainUi()
{
// Detach old widget
setCentralWidget(nullptr);
// Construct main UI
ui = new Ui::MainWindow();
ui->setupUi(this);
// Hide Find line edit for now
ui->mFindFrame->setVisible(false);
helper::EscapeKeyEventFilter* eventFilter = new helper::EscapeKeyEventFilter(ui->mFindEdit);
connect(eventFilter, SIGNAL(escapePressed(QObject*)), this, SLOT(findRejected(QObject*)));
ui->mFindEdit->installEventFilter(eventFilter);
//QCoreApplication::setOrganizationName(COMPANY);
// Set this to your own appcast URL, of course
FvUpdater::sharedUpdater()->SetFeedURL("http://satorilight.com/LittAppCast.xml");
initClient();
QApplication::postEvent(this, new AttachDatabaseEvent());
}
// Ask password
void MainWindow::askDbPassword(const QString& message)
{
setCentralWidget(nullptr); setCentralWidget(new QWidget(this));
auto cdw = new ConnectDbWidget(message, centralWidget());
connect(cdw, SIGNAL(passwordEntered(QString)), this, SLOT(onDbPasswordEntered(QString)));
connect(cdw, SIGNAL(cancelled()), this, SLOT(onDbPasswordCancelled()));
QVBoxLayout* l = new QVBoxLayout(centralWidget());
l->addWidget(cdw);
l->setAlignment(Qt::AlignCenter);
centralWidget()->setLayout(l);
}
void MainWindow::askNewDbPassword()
{
setCentralWidget(nullptr); setCentralWidget(new QWidget(this));
auto w = new OpenOrCreateDbWidget(centralWidget());
connect(w, &OpenOrCreateDbWidget::databaseChanged, [this](const QString& path) { onDatabaseChanged(path); });
connect(w, &OpenOrCreateDbWidget::passwordEntered, [this](const QString& password) { onNewDbPasswordEntered(password); });
auto l = new QVBoxLayout(centralWidget());
l->addWidget(w);
l->setAlignment(Qt::AlignCenter);
centralWidget()->setLayout(l);
}
void MainWindow::startOrStopTracking() void MainWindow::startOrStopTracking()
{ {
if (!mCurrentTask) if (!mCurrentTask)
@ -1351,61 +1397,12 @@ void MainWindow::showTimeReport()
trz.exec(); trz.exec();
} }
void MainWindow::newPasswordDialogFinished(int status)
{
if (status == QDialog::Accepted)
{
Storage::instance().setKey(mNewPasswordDlg->password());
if (!Storage::instance().create())
{
// Quit application
mPasswordFailed = true;
alertBox(tr("Error"), tr("Failed to initialize database"), AlertType_Critical);
}
// Remember password if it is specified in settings
if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool())
mSettings->data()[KEY_PASSWORD] = mNewPasswordDlg->password();
else
mSettings->data()[KEY_PASSWORD] = NOPASSWORDSTRING;
// Flush settings
mSettings->save();
connectUiToDatabase();
}
else
close();
}
void MainWindow::passwordDialogFinished(int status)
{
QString password;
if (status == QDialog::Accepted)
{
password = mPasswordDlg->password();
openDatabase(password);
connectUiToDatabase();
}
else
{
mPasswordFailed = false;
QApplication::postEvent(this, new ClientCloseEvent());
}
}
void MainWindow::criticalAlertFinished(int /*status*/) void MainWindow::criticalAlertFinished(int /*status*/)
{ {
QApplication::postEvent(this, new ClientCloseEvent()); QApplication::postEvent(this, new ClientCloseEvent());
} }
void MainWindow::openAlertFinished(int /*status*/)
{
mPasswordDlg = new PasswordDlg(this);
connect(mPasswordDlg, SIGNAL(finished(int)), this, SLOT(passwordDialogFinished(int)));
mPasswordDlg->show();
}
void MainWindow::warningAlertFinished(int /*status*/) void MainWindow::warningAlertFinished(int /*status*/)
{ {
} }
@ -1618,3 +1615,72 @@ void MainWindow::trayWindowDestroyed(QObject *object)
{ {
mTrayWindow = nullptr; mTrayWindow = nullptr;
} }
void MainWindow::onDbPasswordEntered(const QString& password)
{
if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool())
{
mSettings->data()[KEY_PASSWORD] = password;
mSettings->save();
}
Storage::instance().setKey(password);
if (!Storage::instance().open())
{
askDbPassword(tr("Invalid password, please try again."));
}
else
{
setupMainUi();
connectUiToDatabase();
loadGeometry();
}
}
void MainWindow::onDbPasswordCancelled()
{
askNewDbPassword();
}
void MainWindow::onNewDbPasswordEntered(const QString& password)
{
if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool())
{
mSettings->data()[KEY_PASSWORD] = password;
mSettings->save();
}
Storage::instance().setKey(password);
// Remove old database
::remove(Storage::instance().path().toStdString().c_str());
// Try to create new one
if (!Storage::instance().create())
{
showFatal(tr("Failed to create new database. Exiting."));
}
else
{
setupMainUi();
connectUiToDatabase();
loadGeometry();
}
}
void MainWindow::onDatabaseChanged(const QString& path)
{
// Bind to specific database
mSettings->data()[KEY_DB_FILENAME_SPECIFIED] = true;
mSettings->data()[KEY_DB_FILENAME] = path;
mSettings->save();
Storage::instance().setPath(path);
askDbPassword();
}
void MainWindow::showFatal(const QString& message)
{
std::cerr << message.toStdString() << std::endl;
exit(EXIT_FAILURE);
}

View File

@ -31,7 +31,7 @@ class MainWindow : public QMainWindow
Q_OBJECT Q_OBJECT
public: public:
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
protected: protected:
void closeEvent(QCloseEvent *); void closeEvent(QCloseEvent *);
@ -49,7 +49,7 @@ private:
QSharedPointer<HIDActivityTracker> mActivityTracker; QSharedPointer<HIDActivityTracker> mActivityTracker;
TrackingStopReason mStopReason; TrackingStopReason mStopReason;
Ui::MainWindow *ui; Ui::MainWindow *ui = nullptr;
TaskTreeModel* mTaskTreeModel; TaskTreeModel* mTaskTreeModel;
PTask mCurrentTask, mAutomaticTask; PTask mCurrentTask, mAutomaticTask;
QTimer* mUpdateTimer; QTimer* mUpdateTimer;
@ -90,6 +90,8 @@ private:
std::deque<PTask> mRecentTrackingTasks; std::deque<PTask> mRecentTrackingTasks;
QMenu* mDockRecentMenu; QMenu* mDockRecentMenu;
QDialog* mTrayWindow = nullptr; QDialog* mTrayWindow = nullptr;
QString mPassword = NOPASSWORDSTRING;
void saveGeometry(); void saveGeometry();
void loadGeometry(); void loadGeometry();
@ -134,6 +136,18 @@ private:
void prepareRecentTasksMenu(QMenu* submenu); void prepareRecentTasksMenu(QMenu* submenu);
void updateAttachmentsLabel(PTask t); void updateAttachmentsLabel(PTask t);
// Builds main UI layut
void setupMainUi();
// Show UI to ask password for existing DB
void askDbPassword(const QString& message = QString(""));
// Show UI to ask password for new database (or select existing database file)
void askNewDbPassword();
// Show UI about fatal alert & button to quit app
void showFatal(const QString& message);
signals: signals:
void onTimeFormatChanged(); void onTimeFormatChanged();
void onTimeChanged(); void onTimeChanged();
@ -181,10 +195,7 @@ public slots:
void showTimeline(); void showTimeline();
void showTimeReport(); void showTimeReport();
void newPasswordDialogFinished(int status);
void passwordDialogFinished(int status);
void criticalAlertFinished(int status); void criticalAlertFinished(int status);
void openAlertFinished(int status);
void warningAlertFinished(int status); void warningAlertFinished(int status);
void toolbarVisibilityChanged(bool visible); void toolbarVisibilityChanged(bool visible);
void showHideToolbar(); void showHideToolbar();
@ -207,6 +218,11 @@ public slots:
void startOnActivity(); void startOnActivity();
void stopOnActivity(); void stopOnActivity();
void trayWindowDestroyed(QObject* object); void trayWindowDestroyed(QObject* object);
void onDbPasswordEntered(const QString& password);
void onDbPasswordCancelled();
void onNewDbPasswordEntered(const QString& password);
void onDatabaseChanged(const QString& path);
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -1,14 +1,55 @@
#include "openorcreatedb_widget.h" #include "openorcreatedb_widget.h"
#include "ui_openorcreatedb_widget.h" #include "ui_openorcreatedb_widget.h"
#include <QFileDialog>
OpenOrCreateDbWidget::OpenOrCreateDbWidget(QWidget *parent) : OpenOrCreateDbWidget::OpenOrCreateDbWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::OpenOrCreateDbWidget) ui(new Ui::OpenOrCreateDbWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
connect(ui->mNewPasswordEdit1, &QLineEdit::returnPressed, [this]() { ui->mNewPasswordEdit2->setFocus(); });
connect(ui->mNewPasswordEdit2, &QLineEdit::returnPressed, [this]() { handleEnteredPasswords(); });
connect(ui->mSelectDatabaseButton, &QPushButton::clicked, [this]() { askForDatabase(); });
connect(ui->mDialogButtonBox, &QDialogButtonBox::accepted, [this]()
{
if (mDbPath.isEmpty())
handleEnteredPasswords();
else
emit databaseChanged(ui->mSelectedDbLabel->text());
});
} }
OpenOrCreateDbWidget::~OpenOrCreateDbWidget() OpenOrCreateDbWidget::~OpenOrCreateDbWidget()
{ {
delete ui; delete ui;
} }
void OpenOrCreateDbWidget::handleEnteredPasswords()
{
if (ui->mNewPasswordEdit1->text().isEmpty() && ui->mNewPasswordEdit2->text().isEmpty())
{
ui->mMessageLabel->setText("Password can't be empty. Please try again!");
}
if (ui->mNewPasswordEdit1->text() == ui->mNewPasswordEdit2->text())
emit passwordEntered(ui->mNewPasswordEdit1->text());
else
{
ui->mNewPasswordEdit1->setText("");
ui->mNewPasswordEdit2->setText("");
ui->mNewPasswordEdit1->setFocus();
ui->mMessageLabel->setText("Passwords are not the same. Please try again!");
}
}
void OpenOrCreateDbWidget::askForDatabase()
{
QString path = QFileDialog::getOpenFileName(this, "Please select existing database", QString(), "*.litt");
if (path.size())
{
mDbPath = path;
ui->mSelectedDbLabel->setText(path);
}
}

View File

@ -17,6 +17,14 @@ public:
private: private:
Ui::OpenOrCreateDbWidget *ui; Ui::OpenOrCreateDbWidget *ui;
QString mDbPath;
void handleEnteredPasswords();
void askForDatabase();
signals:
void databaseChanged(const QString& path);
void passwordEntered(const QString& password);
}; };
#endif // OPENORCREATEDB_WIDGET_H #endif // OPENORCREATEDB_WIDGET_H

View File

@ -6,10 +6,22 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>549</width> <width>400</width>
<height>384</height> <height>300</height>
</rect> </rect>
</property> </property>
<property name="minimumSize">
<size>
<width>400</width>
<height>300</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>400</width>
<height>400</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
@ -59,6 +71,16 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<widget class="QLabel" name="mMessageLabel">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
@ -106,7 +128,7 @@
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="standardButtons"> <property name="standardButtons">
<set>QDialogButtonBox::Ok</set> <set>QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>
</property> </property>
<property name="centerButtons"> <property name="centerButtons">
<bool>true</bool> <bool>true</bool>