我是C ++的初学者,因为我是Java-Dev。我现在正在学习Qt。 现在我想在我的中心对象上的widget应用程序中保存特殊功能(例如,一堆发送不同网络命令的方法或类似的东西)。在我的mainwindow.cpp中,我有这个
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//...
BusinessLogic* bl = new BusinessLogic;
bl->setMyValue(44);
this->setBusinessLogic(bl);
this->getBusinessLogic();
//...
}
BusinessLogic* MainWindow::getBusinessLogic()
{
return this->bl;
}
void MainWindow::setBusinessLogic(BusinessLogic* newbl)
{
this->bl = newbl;
}
其中BusinessLogic.cpp是我想从我的应用程序中的所有窗口访问的类。所以在我的Dialog中,当点击pushButton时获取opend,我尝试在构造函数中使用这样的businesslogic实例
Dialog::Dialog(QDialog *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
//...
((MainWindow*)parent)->getBusinessLogic();
}
不幸的是,每次对话框实例化时程序都会崩溃(调用带有((MainWindow*)parent)->getBusinessLogic();
的行。
我该怎么办?
答案 0 :(得分:3)
有几种方法可以实现您的目标(一切都取决于您的要求),但一种方法是您可以创建BusinessLogic的Singleton类,然后在任何地方访问它。看看here。 OR 您还可以将第一类的对象传递给另一个类。 OR 您可以使用信号槽机制。
为您提供最佳解决方案
Class BLogic{
public:
static BLogic* instance(){
static BLogic ins;
return &ins;
}
void setVal(int v){
val = v;
}
private:
BLogic(){}
int val;
};
现在你可以从任何类来调用BLogic的函数,比如
BLogic::instance()->setVal(10);
OR 传递对象的示例可以是
class ClassA
{
public:
void setClassB(ClassB *ob){
m_classB = ob;
}
ClassB* getClassB(){
return m_classB;
}
private:
ClassB* m_classB;
};
class ClassB
{
public:
void setClassA(ClassA *ob){
m_classA = ob;
}
ClassA* getClassA(){
return m_classA;
}
private:
ClassA* m_classA;
};
现在来自main.cpp
ClassA* obA = new ClassA;
ClassB* obB = new ClassB;
obA->setClassB(obB);
obB->setClassA(obA);
答案 1 :(得分:2)
不要将零父母或悬空指针传递给对话框。
但更严重的是,验证您的假设:
qDebug() << "the parent object is" << parent;
auto p = qobject_cast<MainWindow*>(parent);
if (p)
p->getBusinessLogic();
调试输出将让您了解父项是否已设置,以及它目前的类型。请记住,在MainWindow
实例的构造过程中,它会经历不同类型(非常字面)。因此,根据您构建孩子的时间,您可能会获得parent
或QWidget*
或QMainWindow*
类型的MainWindow*
。在破坏期间,您甚至可以获得QObject*
父母!