/*!
\page pref-pane.html
\title 7. Adding Preferences Pane
Preferences dialog in Qt Creator is used to configure the Qt Creator settings. Since Qt Creator is just a plugin loader that
loads all the relevant plugins, the preferences dialog shows pages that configure plugins. You can get to it by clicking
Tools->Options.
\inlineimage qtc-options-7.png
Each plugin provides one or more options pages that get shown in the preferences dialog. In the following sub-sections
we will learn how to add our own pages to the dialog.
\section1 7.1 Core::IOptionsPage interface
The Core of Qt Creator exposes an interface called \bold{Core::IOptionsPage}. The interface is defined in
plugins/coreplugin/dialogs/ioptionspage.h.
\code
class CORE_EXPORT IOptionsPage : public QObject
{
Q_OBJECT
public:
IOptionsPage( *parent = 0) : QObject(parent) {}
virtual ~IOptionsPage() {}
virtual QString id() const = 0;
virtual QString trName() const = 0;
virtual QString category() const = 0;
virtual QString trCategory() const = 0;
virtual QWidget *createPage(QWidget *parent) = 0;
virtual void apply() = 0;
virtual void finish() = 0;
};
\endcode
By implementing the above interface and exposing an instance of it, we will be able to register new pages with the
preferences dialog.
\section1 7.2 Preparing the options-page
Let's implement a plugin that shows an options page that lists out all the open and modified files.
\section2 Step 1: Implementing the "modified file" list widget
The modified file list widget is simply a \bold{QListWidget} that shows all the modified files from the project manager. The
class declaration is as follows
\code
#include
class ModifiedFileListWidget: public QListWidget
{
Q_OBJECT
public:
ModifiedFileListWidget(QWidget* parent=0);
~ModifiedFileListWidget();
};
\endcode
Within the constructor we populate the list widget with names of the modified pages
\code
#include
#include
#include
ModifiedFileListWidget::ModifiedFileListWidget(QWidget* parent):QListWidget(parent)
{
// Show the list of modified pages
Core::FileManager* fm = Core::ICore::instance()->fileManager();
QList files = fm->modifiedFiles();
for(int i=0; iaddItem(files.at(i)->fileName());
}
\endcode
The destructor does nothing.
\code
ModifiedFileListerPage::~ModifiedFileListerPage()
{
}
\endcode
\section2 Step 2: Implementing the Core::IOptionsPage interface
We implement the \bold {Core::IOptionsPage} interface in a class called \bold {ModifiedFileLister}. The class declaration
is as follows
\code
#include
class ModifiedFileLister : public Core::IOptionsPage
{
Q_OBJECT
public:
ModifiedFileLister(QObject *parent = 0);
~ModifiedFileLister();
// IOptionsPage implementation
QString id() const;
QString trName() const;
QString category() const;
QString trCategory() const;
QWidget *createPage(QWidget *parent);
void apply();
void finish();
};
\endcode
The constructor and destructor are straightforward and easy to understand.
\code
ModifiedFileLister::ModifiedFileLister(QObject *parent): IOptionsPage(parent)
{
}
ModifiedFileLister::~ModifiedFileLister()
{
}
\endcode
The \bold{id()} method should be implemented to return a unique identifier for the options page provided by this class. The
string will be used internally to \underline{\bold{id}}entify the page.
\code
QString ModifiedFileLister::id() const
{
return "ModifiedFiles";
}
\endcode
The \bold {trName()} method should be implemented to return a translated string name that will be shown in the options
dialog.
\code
QString ModifiedFileLister::trName() const
{
return tr("Modified Files");
}
\endcode
The \bold{category()} and \bold{trCategory()} methods should be implemented to return the group under which we want to
show the page. The latter returns the translated version of the string returned by the former.
\code
QString ModifiedFileLister::category() const
{
return "Help";
}
QString ModifiedFileLister::trCategory() const
{
return tr("Help");
}
\endcode
The \bold{createPage()} method should be implemented to return a new instance of the page implemented in step 1.
\code
QWidget *ModifiedFileLister::createPage(QWidget *parent)
{
return new ModifiedFileListWidget(parent);
}
\endcode
The methods \bold {apply()} and \bold {finish()} can be implemented to accept the changes made by the user made on the
page. In our case we don't have any changes to accept, so we leave the methods empty.
\code
void ModifiedFileLister::apply()
{
// Do nothing
}
void ModifiedFileLister::finish()
{
// Do nothing
}
\endcode
\section2 Step 3: Implementing the modified-file-lister plugin
We implement the plugin class similar to the \bold {DoNothingPlugin} class described in Chapter 2. Hence, we only
describe the implementation of the initialize method of the \bold {ModifiedFileListerPlugin} class here.
\code
bool ModifiedFileListerPlugin::initialize(const QStringList& args, QString *errMsg)
{
Q_UNUSED(args);
Q_UNUSED(errMsg);
addAutoReleasedObject(new ModifiedFileLister);
return true;
}
\endcode
\section2 Step 4: Testing the plugin
Upon compiling the plugin and restarting Qt Creator, we can notice in the options dialog the newly added "Modified
Files" page.
\inlineimage qtc-testplugin-7.png
*/