【问题标题】:C++ / Qt : passing variables to be changed in the classC ++ / Qt:传递要在类中更改的变量
【发布时间】:2010-08-08 10:27:26
【问题描述】:

所以我的项目中有两个表单:MainWindow 和 Options Form (OptForm;QWidget); 现在,我在 MainWindow 中创建(只需拖动到窗体)QPushButton 以打开 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(); 将布尔值更改为 truefalse

现在,在这些函数中,我有一行 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 发送信号呢?

提前致谢。 (我想我把事情搞砸了


好的,编译器错误已修复,但现在,当我按下该按钮时,窗口立即出现并关闭:/

【问题讨论】:

  • 这应该是一个模态对话框吗?
  • 不,QWidget 里面有一些东西。
  • @EdgeLuxe,那么表单是如何显示的呢?根据您提供的代码,由于 RAII,表格在 MainWindow::openOpt 的末尾被销毁。
  • 我不知道做我提到的事情的正确方法,这就是我粘贴所有功能的原因。那么如何正确显示选项窗口呢?
  • 猜猜我明白了。解决方案是创建一个析构函数。

标签: c++ qt class options


【解决方案1】:

大概你的意思是;

* (this->variable1Pointer) = true;

您可以缩短为:

* variable1Pointer = true;

虽然这个类的设计对我来说似乎是错误的 - 类通常不应该修改本身不是类成员的东西。

【讨论】:

    【解决方案2】:

    不是很清楚你到底想做什么,只是看看语法错误,你需要这样的东西

    *(this->variable1Pointer) = true
    

    【讨论】:

      【解决方案3】:

      一些建议:

      • 使用引用而不是指针,它们通常与使用中的指针非常相似,但更安全、更容易一些。写bool & variable1Ref就可以当变量了。
      • 在构造函数中使用初始化列表
      • 在一个类中混合数据及其呈现OptForm 是个坏主意。这对于小型应用程序来说可能很好,但是当应用程序增长时,事情很容易搞砸。使用数据存储类 (Model) 和显示它的类 (View)。

      【讨论】:

      • 如果要使用引用,您必须使用初始化列表。
      • 嗯,作为班级成员的引用充满了问题——这对我来说似乎是个坏建议。
      • 应用不大,所以我想一个类应该没问题。无论如何,我没有其他可能的选项供用户选择 - 只有 2 个布尔值。这是初始化列表。怎么了? OptForm::OptForm(bool & expertR, bool & verboseR, QWidget *parent) : QWidget (parent), bool & variable1Ref(variable1), bool & variable2Ref(variable2)怎么了?
      • @strager:是的,你是对的。与 const 指针相同。 @Neil:他们有什么问题? (除了与指向外部创建对象的指针相同的问题之外?)
      • @EdgeLuxe:看起来不错,但您需要在初始化列表中使用参数名称(expertR 和 verboseR)作为参数。
      【解决方案4】:

      现在您的 Widget 在创建后被销毁(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
      }
      

      另一个选项:在堆上创建对话框,将finished() 信号连接到另一个槽并调用open()。 另请注意,如果您在堆上创建小部件或对话框,它们不会在其父对话框被删除之前被删除(如果您没有设置父对话框,则永远不会),除非您手动删除它们或调用 setAttribute(Qt::WA_DeleteOnClose)他们。

      并且:不要传递指针,使用 setter/getter 并在用户接受对话框时应用更改。例如,如果对某些“设置”对象进行操作:

      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() );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2013-04-04
        • 2014-07-11
        相关资源
        最近更新 更多