Qt Widget的一次经历

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);
就不一样了。




原文地址:https://www.cnblogs.com/hitzzq/p/13927034.html