class RobotRemote : public QWidget { public: RobotRemote(QWidget * parent = nullptr); ~RobotRemote(); bool Start(); signals: void signalUpdateUi(); public slots: void onUpdateUi(); private: Json::Value mJsonString; } RobotRemote::RobotRemote(QWidget * parent ) :QWidget(parent) {
QObject::connect(this,SIGNAL(signalUpdateUi()),this,SLOT(onUpdateUi())); mJsonString = Json::Value::null;
Start(); } bool RobotRemote::Start() { // 加载地图 QString fileName = QFileDialog::getOpenFileName(this, tr("open file"), "", tr("JsonFile(*.json);")); if (!fileName.isEmpty()) { mJsonString = UmJson::ReadFileToJson(fileName.toStdString()); if(!mJsonString.empty()) HandleGetMap(mJsonString); LOG(INFO)<<"OpenMap: "<<QThread::currentThread(); } } void RobotRemote::onUpdateUi() { if(!mJsonString.empty()) HandleGetMap(mJsonString); LOG(INFO)<<"AddLabel: "<<QThread::currentThread(); }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->centralWidget->setLayout(ui->gridLayout); mPRR = GetRobotRemoteInterface(); if(mPRR==nullptr) { LOG(WARNING)<<"RobotRemote allocate object failed! "; return; } ui->stackedWidget->setCurrentWidget(ui->mainpage); mPRR->setParent(ui->mainpage); mPRR->move(0,0); //to its parent mPRR->resize(840,678);//to its parent }

ui->stackedWidget->setCurrentWidget(ui->mainpage);
mPRR->setParent(ui->mainpage);
Start()可以认为在构造函数中一开始就调用了,此时打开一个文件,mJsonString中有Json文件中读出来的内容。 用信号触发槽函数onUpdateUi()执行后,mJsonString内容是没有变的,我认为这是符合我的期望的。
但是如果我改成:去掉
mPRR->setParent(ui->mainpage); mPRR->move(0,0); //to its parent mPRR->resize(840,678);//to its parent
保留
ui->stackedWidget->setCurrentWidget(ui->mainpage);
mJsonString竟然为空,中间没有任何mJsonString清空或修改的操作,线程id也没有变。
对Qt看来还不了解。继续追。。。
槽函数的控件"mainpage",
Start()的控件对象
根本就是两个控件,所以值确实是不一样的。
问题出在了这里:异常的例子里面
ui->stackedWidget->setCurrentWidget(ui->mainpage);
这个操作把当前的currentWidget置为了RobotRemote类型的控件(QWidget),这个控件与
mPRR = GetRobotRemoteInterface();
这个RobotRemote控件一点关系都没有,尽管他们都是RobotRemote类型的,但是ui->mainpage 并不是 mPRR指向的那个全局的RobotRemote对象。
但加了
mPRR->setParent(ui->mainpage);
就不一样了。