1 Востаннє редагувалося Betterthanyou (20.05.2016 17:08:32)

Тема: Qt, Успадкування

Є в мене клас authorization i registration в них є багато спільних методів, але розглянемо один on_ButtonLock_clicked, оскільки on_ButtonLock_clicked використовується в двох класах то я зробив третій account в який переніс цей метод
Ось так це все виглядає
на slots i Q_OBJECT не звертайте уваги то від QT
account

class account : public QMainWindow
{
    Q_OBJECT
public:
    account();
protected slots:
    void on_ButtonLock_clicked();
protected:
};

account реалізація on_ButtonLock_clicked

void account::on_ButtonLock_clicked()
{
    static bool key = true;
    if(key=!key)
        ui->EditPassword->setEchoMode(QLineEdit::Password);
    else
        ui->EditPassword->setEchoMode(QLineEdit::Normal);
}

authorization

namespace Ui {
class authorization;
}

class authorization : public account
{
    Q_OBJECT
public:
    explicit authorization();
    ~authorization();
private:
    Ui::authorization *ui;
};

registration

namespace Ui {
class registration;
}

class registration : public account
{
    Q_OBJECT
public:
    explicit registration();
    ~registration();
private:
    Ui::registration *ui;
};

А тепер проблема, ui яке я використовував у методі on_ButtonLock_clicked в класі account для registration і authorization має різні типи тому не вийде просто створити там об'єкт ui типу account

Ui::account *ui;

тоді ui просто не матиме EditPassword.
Як вирішити цю проблему ?

2 Востаннє редагувалося leofun01 (20.05.2016 17:41:45)

Re: Qt, Успадкування

В мене питання:

void account::on_ButtonLock_clicked()
{
    static bool key = true;
    if(key=!key) // <---------------------------------------- Що це ?
        ui->EditPassword->setEchoMode(QLineEdit::Password);
    else
        ui->EditPassword->setEchoMode(QLineEdit::Normal);
}

Я б зрозумів, якби таке було в циклі, але тут ...

3

Re: Qt, Успадкування

Ці два UI мабуть мають спільних предків, тому можна створити поле з типом їхнього предка. А якщо оцей EditPassword в обох випадках має однаковий тип, то можна створити поле посилання прямо на нього.
Іще варіант для усіх потрібних дій з UI зробити інтерфейс (Q_DECLARE_INTERFACE), який потім реалізувати в authorization і registration. Але це якщо в account багато логіки, а роботи з UI мало.

Подякували: Betterthanyou, leofun012

4 Востаннє редагувалося Betterthanyou (20.05.2016 18:09:22)

Re: Qt, Успадкування

Прихований текст
leofun01 написав:

В мене питання:

void account::on_ButtonLock_clicked()
{
    static bool key = true;
    if(key=!key) // <---------------------------------------- Що це ?
        ui->EditPassword->setEchoMode(QLineEdit::Password);
    else
        ui->EditPassword->setEchoMode(QLineEdit::Normal);
}

Я б зрозумів, якби таке було в циклі, але тут ...

Та що тут не зрозуміло ?
setEchoMode це модель поля Password то крапочки "..." а Normal то просто те що вводиться "123"
в мене є кнопка яка викликає це метод

а тепер щоб не писати щось такого (ну бо навіщо багато писати)

if(key)
   key = false;
else
   key = true;

C++ дозволяє робити присвоєння прямо в умову, якщо це написати на словах вийде щось таке
перевірити(key присвоїти інверсоване key) == true

Подякували: leofun011

5

Re: Qt, Успадкування

Torbins написав:

А якщо оцей EditPassword в обох випадках має однаковий тип, то можна створити поле посилання прямо на нього.

А це хороша ідея зараз спробую

6 Востаннє редагувалося leofun01 (20.05.2016 18:25:13)

Re: Qt, Успадкування

Я про умову питав.
Чому не так:

void account::on_ButtonLock_clicked()
{
    static bool key = false;
    ui->EditPassword->setEchoMode(key ? QLineEdit::Password : QLineEdit::Normal);
}

?

7

Re: Qt, Успадкування

Прихований текст
leofun01 написав:

Я про умову питав.
Чому не так:

void account::on_ButtonLock_clicked()
{
    static bool key = false;
    ui->EditPassword->setEchoMode(key ? QLineEdit::Password : QLineEdit::Normal);
}

?

Тут key завжди буде false, а мені потрібно щоб значення постійно змінювалося при кожному натисканні
можна звичайно використати і "?" але тоді вже буде так

void authorization::on_ButtonLock_clicked()
{
    static bool key = true;
    ui->EditPassword->setEchoMode((key=!key) ? QLineEdit::Password : QLineEdit::Normal);
}
Подякували: leofun011

8

Re: Qt, Успадкування

Прихований текст
Betterthanyou написав:
Torbins написав:

А якщо оцей EditPassword в обох випадках має однаковий тип, то можна створити поле посилання прямо на нього.

А це хороша ідея зараз спробую

Так поле посилання створив
клас account

class account : public QMainWindow
{
    Q_OBJECT
public:
    account();

protected slots:

    void on_ButtonLock_clicked();

protected:
    QLineEdit *EditPassword;
};

реалізація on_ButtonLock_clicked

void account::on_ButtonLock_clicked()
{

    //    Hiding and showing password

    static bool key = true;
    if(key=!key)
        this->EditPassword->setEchoMode(QLineEdit::Password);
    else
        this->EditPassword->setEchoMode(QLineEdit::Normal);
}

конструктор authorization

authorization::authorization() :
    ui(new Ui::authorization)
{
    ui->setupUi(this);
    this->EditPassword = ui->EditPassword;
}

конструктор registration

registration::registration() :
    ui(new Ui::registration)
{
    ui->setupUi(this);
    this->EditPassword = ui->EditPassword;
}

Начебто все працює, дякую!
Але якщо будуть ще ідеї кажіть