0

我只想在 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();
}

这是我正在做的第三个左右的小型学习计划,我遇到了同样的问题。它开始变得有点烦人。任何帮助将不胜感激。

4

2 回答 2

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);
}

像这样,类中的变量将被填充,您的代码应该按预期工作。

于 2013-03-02T12:52:58.780 回答
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");
于 2013-03-02T12:53:06.130 回答