C ++ / Qt: передача переменных для изменения в классе - PullRequest
0 голосов
/ 08 августа 2010

Итак, у меня есть две формы в моем проекте: MainWindow и Options Form (OptForm; QWidget); Теперь я создаю (просто перетаскивая на форму) QPushButton в MainWindow, чтобы открыть OptForm, и передавая переменные, которые OptForm может изменить.

void MainWindow::openOpt() //Slot; QPushButton calls(?) it
{
    OptForm w (this->variable1,this->variable2, this);
    w.show();
}

Конструктор OptForm:

OptForm::OptForm(bool & variable1, bool & variable2, QWidget *parent)
    : QWidget (parent)
{
    variable1Pointer = &variable1;
    variable2Pointer = &variable2;
    ui.setupUi(this);
}

options.h имеет:

class OptForm : public QWidget
{
    Q_OBJECT

public:
    OptForm(bool & variable1, bool & variable2, QWidget *parent)

    //Pointers for encrypt and verbose
    bool * variable1Pointer;
    bool * variable2Pointer;

public slots:

    void change_variable1();
    void change_variable2();

private:
    Ui::OptForm ui;
};

Теперь void change_variable1(); и void change_variable2(); изменяют логические значения на true или false.

Теперь в этих функциях у меня есть строка this->*variable1Pointer = true;

И я получаю ошибку компилятора: '((OptForm*)this)->OptForm::variable1Pointer' cannot be used as a member pointer, since it is of type 'bool*' Как мне все сделать правильно? (Исправлено, СПАСИБО)

Другое, что мне нужно, это сообщить MainWindow, когда OptForm закрылся, чтобы проверить, изменились ли параметры. Итак, где я должен разместить этот код? В openOpt или создайте слот, который будет выполняться (?), Когда OptForm закрывается? Как я могу отправить сигнал в MainWindow?

Заранее спасибо. ( Полагаю, я все испортил )


Хорошо, ошибка компилятора исправлена, но теперь, когда я нажимаю эту кнопку, окно открывается и сразу закрывается: /

Ответы [ 4 ]

1 голос
/ 08 августа 2010

Не очень понятно, что именно вы пытаетесь сделать, но, просто глядя на синтаксическую ошибку, вам нужно что-то вроде этого

*(this->variable1Pointer) = true
1 голос
/ 08 августа 2010

Некоторые предложения:

  • Используйте ссылки вместо указателей, они обычно очень похожи на используемые указатели, но немного безопаснее и проще.Просто напишите bool & variable1Ref, и тогда вы сможете использовать его в качестве переменной.
  • Использовать список initiliazer в конструкторе
  • , смешивая данные и их представление в одном классе OptForm - плохая идея.Это может быть хорошо для небольших приложений, но вещи легко портятся, когда приложение растет.Используйте класс хранения данных (модель) и класс, чтобы показать его (представление).
1 голос
/ 08 августа 2010

Предположительно, вы имеете в виду:

* (this->variable1Pointer) = true;

, которое вы можете сократить до:

* variable1Pointer = true;

хотя дизайн этого класса мне кажется неправильным - классы обычно не должны изменять вещикоторые сами не являются членами класса.

0 голосов
/ 08 августа 2010

Прямо сейчас ваш виджет уничтожается после создания (show () не блокируется, а ваш виджет создается в стеке, поэтому вы ничего не видите. Если вы хотите заблокировать до закрытия окна, а затемобработав результат, вы можете использовать QDialog и вызвать QDialog :: exec ():

OptDialog w (this->variable1,this->variable2, this); //must inherit from QDialog instead of QWidget
if ( w.exec() == QDialog::Accepted ) { // blocks until the user closes the dialog
    //process input
}

Другой вариант: создать диалог в куче, подключить сигнал finish () к другому слоту и вызвать open ()Также обратите внимание, что если вы создаете виджеты или диалоговые окна в куче, они не удаляются перед удалением их родительских диалогов (никогда, если вы не устанавливаете родительский), если вы не удалите их вручную или не вызовете setAttribute (Qt :: WA_DeleteOnClose)на них.

И: не передавайте указатели, используйте сеттеры / получатели и применяйте изменения, если пользователь принимает диалоговое окно. Например, при работе с каким-либо объектом «настройки»:

OptDialog w (this->variable1,this->variable2, this); 
w.setSomeBoolOption( settings.someBoolOption() );
w.setAnotherBoolOption( settings.anotherBoolOption() );
if ( w.exec() == QDialog::Accepted ) { //user accepted, apply changes to settings:
    settings.setSomeBoolOption( w.someBoolOption() );
    settings.setAnotherBoolOption( w.anotherBoolOption() );
}
...