在Qt中传递父指针|错误:没有在QObject中命名的成员

Passing the parent pointer in Qt | ERROR: no member named in QObject

本文关键字:QObject 成员 错误 Qt 指针      更新时间:2023-10-16

我是qt的新手,我正在尝试创建一个程序,其中主窗口调用QDialog来输入一些数据。
问题是我的QDialog中的parent()没有任何访问主窗口的公共方法的权限,在我们的例子中是

void save_city(const City *city); //public method of MainWindow

代码实际上很大,所以这里是一些代码。谢谢。

mainwindow.h

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMainWindow>
#include <QTextStream>
#include <QVector>
#include <QDebug>
#include <QFile>
#include "dialog_add_city.h"
#include "street.h"
#include "city.h"
#include "map.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    //main Window constructor
    explicit MainWindow(QWidget *parent = 0);
    //main Window deconstructor
    ~MainWindow();
    /*utility function to save the city
     *the function is public so that also QDialogs 
     *data saves can */
   //////////////
   //here is the public function
    void save_city(const City *city);

private slots:

private:
    Map mainMap;
    Ui::MainWindow *ui;
    QGraphicsView view;
    QGraphicsScene scene;
};

dialog_add_city.h

#ifndef DIALOG_ADD_CITY_H
#define DIALOG_ADD_CITY_H
#include <QDialog>
#include "mainwindow.h"
#include "City.h"
namespace Ui {
class Dialog_Add_City;
}
class Dialog_Add_City : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog_Add_City(QWidget *parent = 0);
    ~Dialog_Add_City();
private slots:
    //Add New City Button clicked-Adds an new city to our city_locations.txt
    void on_PushButton_Add_New_City_clicked();
private:
    Ui::Dialog_Add_City *ui;
};
#endif // DIALOG_ADD_CITY_H

dialog_add_city.cpp

#include "dialog_add_city.h"
#include "ui_dialog_add_city.h"
Dialog_Add_City::Dialog_Add_City(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog_Add_City)
{
    ui->setupUi(this);
}
Dialog_Add_City::~Dialog_Add_City()
{
    delete ui;
}
void Dialog_Add_City::on_PushButton_Add_New_City_clicked()
{
    City *city=new City(ui->lineEdit_cityName->text(),
                        ui->lineEdit_X_Ko->text().toDouble(),
                        ui->lineEdit_Y_Ko->text().toDouble());
    qDebug() << ui->lineEdit_cityName->text()
             << ui->lineEdit_X_Ko->text()
             << ui->lineEdit_Y_Ko->text();
 /////////////////////////////
 //HERE IS THE PROBLEM   
 parent()->save_city(city);        
}

欢迎任何其他建议!

问题是parent()将返回父对象作为QObject的指针。

QObject文档

正如dreschrjm指出的,你可以尝试通过

来强制转换对象。
MyWidget *myWidget = qobject_cast<MyWidget *>(obj);

建议:使用Qt的信号/插槽机制来避免对父进程的向后引用。

声明save_cityDialog_Add_City中的信号。声明MainWindow中的save_city为槽位

连接创建对话框的地方:例如

void MainWindow::show_add_city_dialog()
{
  Dialog_Add_city dialog;
  connect(&dialog, &Dialog_Add_city::save_city, this, &MainWindow::save_city);
  dialog.exec();
}

Dialog_Add_City中的parent()->save_city(city);替换为emit save_city(city);

确保新的城市对象不会泄漏,我认为更好的设计是在其他地方创建城市对象,而不是在对话框中。

emit save_city(ui->lineEdit_cityName->text(), 
  ui->lineEdit_X_Ko->text().toDouble(), 
  ui->lineEdit_Y_Ko->text().toDouble());

和槽

void MainWindow::save_city(const QString &cityName, double x, double y)
{
  City *city=new City(cityName, x, y);
  // do some interresting things with city.
}