1 Востаннє редагувалося Betterthanyou (23.08.2016 21:34:03)

Тема: Qt Як змінити призначення форми

Є форма як містить LineEditor і два PushButton, ця форма зберігає псевдонім по натисненню на PushButton "підтвердити", а також ця форма підходить для перейменування псевдоніму. Все що потрібно змінити це дію кнопки "підтвердити" в одному випадку вона має зберігати псевдонім, а в іншому перейменовувати псевдонім.

В мене є клас що був створений автоматично для взаємодії з користувацьким інтерфейсом

namespace Ui {
class createProfile;
}

клас (який теж був створений автоматично) для створення нового псевдоніму

class createProfile : public QMainWindow
{
    Q_OBJECT
public:
    explicit createProfile(QWidget *parent = 0);
    ~createProfile();
private slots:
    void on_pushButtonCancel_clicked();
    void on_pushButtonSubmit_clicked();
protected:
    Ui::createProfile *ui;

клас (а це вже я створив сам) для перейменування псевдоніму

class renameProfile : public QMainWindow
{
    Q_OBJECT
public:
    explicit renameProfile(QWidget *parent = 0);
    ~renameProfile();
private slots:
    void on_pushButtonSubmit_clicked();
protected:
    Ui::createProfile *ui;
};

on_pushButtonCancel_clicked - скасувати
on_pushButtonSubmit_clicked - в класі createProfile зберігає псевдонім
on_pushButtonSubmit_clicked - в класі renameProfile перейменовує псевдонім

Як зробити так щоб працювали слоти які виконують одинакові дії в обох класах, наприклад Cancel ?

Звичайно не проблема скопіювати слот on_pushButtonCancel_clicked() в renameProfile, але якщо буде слоті набагато більше. Можливо краще просто скопіювати форму з всіма її файлами ?

2 Востаннє редагувалося Betterthanyou (05.09.2016 18:45:48)

Re: Qt Як змінити призначення форми

Я вже розібрався як це зробити, якщо комусь цікаво.
Спочатку потрібно зробити форму Profile, ну і звичайно qt автоматично створить для нас клас

namespace Ui {
class profile;
}

і

class profile : public QMainWindow
{
    Q_OBJECT
public:
    explicit profile (QWidget *parent = 0);
    ~profile ();
protected:
    Ui::profile *ui;
}

тепер потрібно зробити спільні слоти які підійдуть як createProfile клас так і renameProfile, в моєму випадку це
on_pushButtonCancel_clicked.
Всі слоти мають бути public або protected для того що вони могли успадкуватися, це саме стосується і поля ui

class profile : public QMainWindow
{
    Q_OBJECT
public:
    explicit profile (QWidget *parent = 0);
    ~profile ();
protected slots:
   void on_pushButtonCancel_clicked();
protected:
    Ui::profile *ui;
}

Також потрібно стерти все що є в конструкторі profile крім ініціалізації класу QMainWindow

profile::profile(QWidget *parent) :
    QMainWindow(parent)
{}

тепер можна створювати класи createProfile і renameProfile з слотами які будуть виконувати різні дії,
ці класи будуть успадковуватися від класу profile.
Поля ui, що відповідає за користувацький інтерфейс, в цих класах вже не потрібно.
Слоти можна робити з будь якими модифікаторами доступу

class createProfile : public profile
{
    Q_OBJECT
public:
    explicit createProfile  (QWidget *parent = 0);
    ~createProfile ();
private slots:
   void on_pushButtonSubmit_clicked();

}
class renameProfile : public profile
{
    Q_OBJECT
public:
    explicit renameProfile (QWidget *parent = 0);
    ~renameProfile ();
private slots:
   void on_pushButtonSubmit_clicked();

}

Конструктори в цих класах потрібно писати як і звичайний конструктори що створюється автоматично, є тільки одна відмінність в прямій ініціалізації замість QMainWindow(parent) потрібно писати profile(parent)

createProfile::createProfile(QWidget *parent):
    profile(parent)
{
    ui = new Ui::profile;
    ui->setupUi(this);
}

аналогічно з renameProfile

Доречі якщо ui спробувати створити прямою ініціалізацією, тобто

createProfile::createProfile(QWidget *parent):
    profile(parent), ui(new Ui::profile)

, то виникає помилка

class 'createProfile' does not have any field named 'ui'

, а якщо ui створювати в самому конструкторі то помилки не має, чому так ?

Ну і приклад

void profile::on_pushButtonCancel_clicked()
{
    qDebug() << "Cancel";
}
void createProfile::on_pushButtonSubmit_clicked()
{
    qDebug() << "INSERT";
}
void renameProfile::on_pushButtonSubmit_clicked()
{
    qDebug() << "UPDATE";
}

Створюю об'єкт класу createProfile

createProfile *win = new createProfile;
win->show();

натискаю на Скасувати і бачу Cancel, натискаю на підтвердити і бачу INSERT

а тепер ін. клас

Створюю об'єкт класу renameProfile

renameProfile *win = new renameProfile;
win->show();

натискаю на Скасувати і бачу Cancel, натискаю на підтвердити і бачу UPDATE

в деструкторах renameProfile і createProfile не потрібно видаляти ui тому що він видаляється в класі profile.