如果Qt像常规C ++一样工作,为什么我不能使用方法访问我的类对象?例如,我在MainWindow.h类的私有字段中声明了一个指向foo对象的指针 我有一个名为setFoo()的方法作为实例化foo对象的类MainWindow的函数。当按下按钮时,会从事件中调用setFoo()函数,我将其命名为on_button_1_clicked。我可以在这个函数中访问我的foo类。但是,当我调用on_button_2_clicked时,foo类无法访问。
void MainWindow::on_pushButton_1_clicked() {
this->setFoo();
qDebug() << QString::fromStdString(this->confirmName());
}
上面的代码将打印出我的一个类数据元素。
void MainWindow::on_pushButton_2_click() {
qDebug() << QString::fromStdString(this->confirmName());
}
上面的代码不会打印出来。
我是QT5的新手,任何帮助都会很棒,因为我已经对这个问题进行了一段时间的讨论,也许这是一般来说接近QT的错误方法。
完整代码: #include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
void setPlayer(int);
std::string getName();
std::string confirmName();
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
Board * board;
上面的代码是标准的MainWindow,但包含了类板
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "Board.h"
#include <string>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
this->setPlayer(2);
qDebug() << QString::fromStdString(this->confirmName());
}
void MainWindow::on_pushButton_2_clicked()
{
qDebug() << QString::fromStdString(this->confirmName());
}
void MainWindow::setPlayer( int num ) {
board= new Board( num );
std::string name_string[2] = {"INPUT1","INPUT2"};
board->addNames( name_string );
qDebug() << QString::fromStdString( getName() ) << endl;
}
std::string MainWindow::confirmName() {
qDebug() << "Confirming Name" << endl;
this->board->test();
Player ** tmp_player = this->board->getPlayer();
std::string tmp_string = tmp_player[0]->getName();
return tmp_string;
}
输出:
/*clicked button1*/
“INPUT1”
Confirming Name
“INPUT1”
/*clicked button2*/
Confirming Name
“”
答案 0 :(得分:0)
说Qt与其他C ++程序的工作方式不同就像是说地球与其他行星的行为不同,因为其他行星没有人类。
就您的代码而言,您使用的唯一Qt特定功能是按钮和主窗口之间的信号槽连接。从您的输出 - 您在单击按钮2时输出“确认名称” - 这似乎正常工作。
因此,您的问题是MainWindow::confirmName()
本身的代码。
1 qDebug() << "Confirming Name" << endl;
2 this->board->test();
3 Player ** tmp_player = this->board->getPlayer();
4 std::string tmp_string = tmp_player[0]->getName();
5 return tmp_string;
正如输出所示,第1行正在运行,因此问题还在于函数。
您尚未提供Board
类或Player
类的代码,因此我们任何人都无法确定问题的确切位置。
供您参考:
您的setPlayer
功能中存在内存泄漏。
void MainWindow::setPlayer( int num ) {
board= new Board( num );
std::string name_string[2] = {"INPUT1","INPUT2"};
board->addNames( name_string );
qDebug() << QString::fromStdString( getName() ) << endl;
}
每次调用此函数时,都会分配一个新的Board
对象,前一个对象会丢失。如果您调用该函数四次,则将分配四个对象,但board
指针仅引用最后一个对象。剩下的就永远丢失了。
我建议进行以下更改:
在构造函数中添加
board = 0;
将您的setPlayer
功能更改为以下内容:
if (board != 0) {
delete board;
}
您的Board
班级正在从Player **
函数返回getPlayer()
。管理指针本身就是一个挑战。管理指针指针更加困难。我建议改用QList<Player*>
。 Qt有许多非常有用的容器类,使用它们。