Have a way of getting the id statically and via virtual call. Not perfect, but works.
Create tabs with a parent set. Avoids creating top-level windows only to be given a parent later.
Q_UNUSED(settings);
}
-void AbstractTab::setName(QString name)
+void AbstractTab::setLabel(QString label)
{
- if (m_label != name)
+ if (m_label != label)
{
- m_label = name;
- emit nameChanged(name);
+ m_label = label;
+ emit nameChanged(label);
}
}
class AbstractTab : public QWidget
{
Q_OBJECT
- Q_PROPERTY(QString label READ label WRITE setName NOTIFY nameChanged)
+ Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY nameChanged)
public:
explicit AbstractTab(QWidget *parent = 0);
~AbstractTab();
virtual QString id() const;
+ static QString staticId();
static QString name();
QString label() const;
void nameChanged(QString label);
public slots:
- void setName(QString label);
+ void setLabel(QString label);
void setMainWindow(MainWindow *mainWindow);
protected:
MainWindow *m_mainWindow;
};
+template<typename T> class AbstractTabBase : public AbstractTab
+{
+public:
+ explicit AbstractTabBase(QWidget *parent = 0) : AbstractTab(parent) {}
+ QString id() const { return T::staticId(); }
+};
+
#endif // ABSTRACTTAB_H
using namespace LocalMyList;
MyListTab::MyListTab(QWidget *parent) :
- AbstractTab(parent),
+ AbstractTabBase(parent),
ui(new Ui::MyListTab)
{
ui->setupUi(this);
delete ui;
}
-QString MyListTab::id() const
+QString MyListTab::staticId()
{
return "mylist";
}
class MyListTab;
}
-class MyListTab : public AbstractTab
+class MyListTab : public AbstractTabBase<MyListTab>
{
Q_OBJECT
explicit MyListTab(QWidget *parent = 0);
~MyListTab();
- QString id() const;
+ static QString staticId();
static QString name();
void init();
using namespace LocalMyList;
ReportsTab::ReportsTab(QWidget *parent) :
- AbstractTab(parent),
+ AbstractTabBase(parent),
ui(new Ui::ReportsTab)
{
ui->setupUi(this);
delete ui;
}
-QString ReportsTab::id() const
+QString ReportsTab::staticId()
{
return "reports";
}
class QSqlQueryModel;
-class ReportsTab : public AbstractTab
+class ReportsTab : public AbstractTabBase<ReportsTab>
{
Q_OBJECT
explicit ReportsTab(QWidget *parent = 0);
~ReportsTab();
- QString id() const;
+ static QString staticId();
static QString name();
void init();
int TabWidget::addTab(const QString &id)
{
- AbstractTab *t = createTab(id);
+ AbstractTab *t = createTab(id, this);
if (!t) return -1;
delete tab;
}
-AbstractTab *TabWidget::createTab(const QString &id)
+AbstractTab *TabWidget::createTab(const QString &id, QWidget *parent)
{
if (!registeredTabs.contains(id))
return 0;
- return registeredTabs.value(id)();
+ return registeredTabs.value(id)(parent);
}
bool TabWidget::registerTab(const QString &id, TabWidget::TabName tabName, TabWidget::TabFactory factory)
Q_OBJECT
Q_PROPERTY(MainWindow *mainWindow READ mainWindow WRITE setMainWindow)
- typedef std::function<AbstractTab *()> TabFactory;
+ typedef std::function<AbstractTab *(QWidget *)> TabFactory;
typedef std::function<QString()> TabName;
public:
MainWindow * m_mainWindow;
public:
- static AbstractTab *createTab(const QString &id);
+ static AbstractTab *createTab(const QString &id, QWidget *parent = 0);
static bool registerTab(const QString &id, TabName tabName, TabFactory factory);
template<typename T> static bool registerTab()
{
- // TODO fix this
- return registerTab(T().id(), T::name, TabWidget::createTab<T>);
+ return registerTab(T::staticId(), T::name, TabWidget::createTab<T>);
}
- template<typename T> static T *createTab() { return new T; }
+ template<typename T> static T *createTab(QWidget *parent) { return new T(parent); }
private:
static QList<QString> tabMenuOrder;