我只想在Qt中创建一个程序,按两个按钮之一,QLabel的文本会根据您更改的按钮而改变。我在运行脚本时遇到运行时错误。我为这个程序制作了一个“自定义”窗口类:
这是头文件:
#ifndef MW_H
#define MW_H
#include <QString>
#include <QPushButton>
#include <QLabel>
#include <QGridLayout>
#include <QDialog>
class MW: public QDialog
{
Q_OBJECT
private:
QPushButton* one;
QPushButton* two;
QLabel* three;
QGridLayout* mainL;
public:
MW();
private slots:
void click_1();
void click_2();
};
#endif // MW_H
这是标题的.cpp:
#include "MW.h"
MW :: MW()
{
//create needed variables
QGridLayout* mainL = new QGridLayout;
QPushButton* one = new QPushButton("Set1");
QPushButton* two = new QPushButton("Set2");
QLabel* three = new QLabel("This text will be changed");
//connect signals and slots
connect(one, SIGNAL(clicked()), this, SLOT(click_1()));
connect(two, SIGNAL(clicked()), this, SLOT(click_2()));
// create layout
mainL->addWidget(one, 1, 0);
mainL->addWidget(two, 1, 1);
mainL->addWidget(three, 0, 1);
setLayout(mainL);
}
void MW :: click_1()
{
three->setText("One Clicked me!");
}
void MW :: click_2()
{
three->setText("Two Clicked me!");
}
最后这是主要功能:
#include <QApplication>
#include "MW.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MW w;
w.setAttribute(Qt::WA_QuitOnClose);
w.show();
return a.exec();
}
这是我正在做的第三个或那么小的学习计划,我遇到了同样的问题。它开始有点烦人了。任何帮助将不胜感激。
答案 0 :(得分:3)
错误在你的构造函数中。
QLabel* three = new QLabel("This text will be changed");
此行将新QLabel存储到局部变量而不是类变量。
因此,您的类变量three
仍为空。 (和其他三个变量一样,但这不是问题,因为你不能在构造函数之外访问它们)
简而言之,修改你的代码如下:
MW :: MW()
{
//create needed variables
mainL = new QGridLayout;
one = new QPushButton("Set1");
two = new QPushButton("Set2");
three = new QLabel("This text will be changed"); //This line, actually.
//connect signals and slots
connect(one, SIGNAL(clicked()), this, SLOT(click_1()));
connect(two, SIGNAL(clicked()), this, SLOT(click_2()));
// create layout
mainL->addWidget(one, 1, 0);
mainL->addWidget(two, 1, 1);
mainL->addWidget(three, 0, 1);
setLayout(mainL);
}
像这样,类中的变量将被填充,您的代码应该按预期工作。
答案 1 :(得分:1)
你的问题是:
QGridLayout* mainL = new QGridLayout;
QPushButton* one = new QPushButton("Set1");
QPushButton* two = new QPushButton("Set2");
QLabel* three = new QLabel("This text will be changed");
您正在创建四个与您的类成员同名的新变量。这些新变量隐藏类成员。因此,使用上面的代码,您永远不会特别初始化MW::three
。调用插槽时,three->setText(...)
取消引用未初始化的指针和内容。
将该代码替换为:
mainL = new QGridLayout;
one = new QPushButton("Set1");
two = new QPushButton("Set2");
three = new QLabel("This text will be changed");