2013-03-02 3 views
0

Я просто хочу сделать программу в Qt, где вы нажимаете одну из двух кнопок, а текст QLabel изменяется в зависимости от кнопки, которую вы изменили. При запуске скрипта я получаю ошибку во время выполнения. Я сделал «обычай» класс окна для этой программы:Qt Runtime Ошибка при использовании производного класса

Это заголовочный файл:

#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

Вы пробовали идти через него с отладчиком? Ошибка вызывается только при нажатии одной из кнопок, да? Ударь это, я понял. –

+0

Вам будет легче помочь, если вы опубликуете сообщение об ошибке, которое вы получили – niculare

+0

. Дело в том, что он иногда компилируется, и когда я что-то сбой, или когда он не компилируется, я получаю следующие ошибки: MW.obj: -1 : ошибка: LNK2001: неразрешенный внешний символ "public: virtual struct QMetaObject const * __thiscall MW :: metaObject (void) const" (? metaObject @ MW @@ UBEPBUQMetaObject @@ XZ) MW.obj: -1: ошибка: LNK2001 : неразрешенный внешний символ "public: virtual void * __thiscall MW :: qt_metacast (char const *)" (? qt_metacast @ MW @@ UAEPAXPBD @ Z) release \ untitled19.exe: -1: ошибка: LNK1120: 3 нерешенных внешних – Bloodcount

ответ

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

Таким образом, переменные в классе будут заполнены, и ваш код должен работать должным образом.

+0

Это сработало, спасибо! – Bloodcount

+0

@Bloodcount Добро пожаловать, и спасибо :) –

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"); 
Смежные вопросы