2016-11-11 65 views
1

嗨,我相当新的Qt场景,我无法更新我的comboBox2基于comboBox1选择。Qt更改ComboBox2基于组合框1

每当我在comboBox1中进行更改时,我的应用程序崩溃,说访问冲突。这可能是非常简单的,但这里是我的代码:在这种情况下,最初的comboBox1有“Car”和“Food”。每当我切换到“食物”,我想我的comboBox2填充项目“鸡蛋”。

任何想法出了什么问题?

main.h

class main: 
{ 
    Q_OBJECT 


public: 
    main() {} 

    public slots : 

    private slots: 
     void onComboBoxIndexChanged(); 

private: 
    QComboBox* comboBox2; 
    void run(); 
}; 

的main.cpp

void main::run() 
{ 
QWidget *w = new QWidget(); 

QComboBox *comboBox1 = new QComboBox(); 
QComboBox *comboBox2 = new QComboBox(); 

comboBox1->addItem("Car"); 
comboBox1->addItem("Food"); 

connect(comboBox1, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged())); 
... 
} 


void main::onComboBoxIndexChanged() 
{ 
QComboBox* combo = dynamic_cast<QComboBox*>(sender()); 

if (combo == nullptr) 
{ 
    return; 
} 

comboBox2->addItem("Egg"); 

} 
+0

您似乎将'QComboBox'对象分配给'run'函数中的局部变量。最有可能的是,你打算把它分配给成员'comboBox2'。 – Mike

+0

嘿@Mike这是一个错字。我实际上正在分配到comboBox2。你看到代码有问题吗? – Arbitel

回答

1

您没有正确解决您的错字。有三件事我看错了,我会认为第三件事会阻止编译。

首先,main.h说你的类名是“main”,但在main.cpp中,你的类是WIPGui。显然,其中一个文件不是正确的。我将继续假设你的实际main.h文件定义了WIPGui类,但是看起来是一样的。

其次,迈克试图指出,运行中的功能,你有这样的:

QComboBox *comboBox2 = new QComboBox(); 

这是建立在“运行”方法的局部变量;它不会分配给您的类成员变量comboBox2。你想要的是:

comboBox2 = new QComboBox(); 

三,你的连接语句应该不会编译基于我们所看到的代码:

connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged())); 

的“组合框”变量任何地方都不会在这个代码存在。如果你在connect语句中实际使用了“comboBox1”,但这只是你在这里展示的代码中的另一个错字,那么connect语句就没有问题。如果这是一个剪切和粘贴,那么我不明白这是如何编译的。

假设你在connect语句中使用了“comboBox1”,那么真正的问题是你永远不会分配成员变量“comboBox2”,并且当你的插槽试图使用它时,你会崩溃。

+0

谢谢!我在代码中有更多的东西,我不得不简化它,因此错字。但第二点是诀窍:)迈克是对的。我对本地和类成员变量感到困惑! – Arbitel