【发布时间】:2014-07-03 14:07:48
【问题描述】:
最近我有一个想法来提高我的编程技能,并尝试编写一个简单的应用程序,比如跳棋。从一开始我就遇到了一个问题,即我的应用程序在我生成一个新窗口“设置”后的几秒钟内停止工作。我注意到如果我注释掉我更改 MainWindow 类的玩家名称的行,这不会发生。 SettingsWindow 是 MainWindow 类的客人。这是一个代码。
#include "settingswindow.h"
#include "ui_settingswindow.h"
settingsWindow::settingsWindow(QWidget *parent, QString player1, QString player2) :
QMainWindow(parent),
ui(new Ui::settingsWindow)
{
ui->setupUi(this);
ui->lineEdit_P1->text()=player1;
ui->lineEdit_P2->text()=player2;
}
settingsWindow::~settingsWindow()
{
delete ui;
}
void settingsWindow::on_lineEdit_P1_editingFinished()
{
chng->player1_Name = ui->lineEdit_P1->text();
}
void settingsWindow::on_lineEdit_P2_editingFinished()
{
chng->player2_Name = ui->lineEdit_P2->text();
}
还有头文件。
#ifndef SETTINGSWINDOW_H
#define SETTINGSWINDOW_H
#include <QMainWindow>
#include "mainwindow.h"
class MainWindow;
namespace Ui {
class settingsWindow;
}
class settingsWindow : public QMainWindow
{
Q_OBJECT
public:
explicit settingsWindow(QWidget *parent = 0);
explicit settingsWindow(QWidget *parent, QString player1, QString player2);
~settingsWindow();
private slots:
void on_lineEdit_P1_editingFinished();
void on_lineEdit_P2_editingFinished();
private:
Ui::settingsWindow *ui;
MainWindow *chng;
};
#endif // SETTINGSWINDOW_H
我将不胜感激。
【问题讨论】:
-
您在使用前是否设置了“chng”变量?如果没有,你肯定会在尝试通过指针访问 MainWindow 类时遇到分段错误。
-
感谢 Oleg Olivson,我设法解决了这个问题。我没有设置变量 chng。菜鸟的错误,现在我有点惭愧。虽然非常感谢您的回答!
-
考虑使用信号/槽机制而不是存储指向主窗口的指针(通常这是糟糕的设计)。另外,附带说明一下,通过常量引用而不是值传递对象:例如
const QString &player1而不是构造函数中的QString player1。尽管 Qt 的隐式共享可以防止创建额外的数据副本,但最好记住 ;) -
一般来说,存储哑指针是,嗯,哑。将
QPointer用于指向位于同一线程中的QObjects only 的弱指针(将它用于其他线程中的对象是错误的),QScopedPointer或std::unique_ptr用于范围生命周期对象,以及QSharedPointer或std::shared_ptr用于共享所有权对象。