views:

421

answers:

5

Hello, I have been working on learning C++ and Qt4 recently, but I have hit a stumbling block.

I have the following class and implementation:

class Window : public QWidget
{
public:
    Window();

public slots:
    void run();

private:
    //...
};

and

Window::Window()
{
    //...

    connect(runBtn,SIGNAL(clicked()),this,SLOT(run()));

    //...
}
Window::run()
{
    //...
}

However, when I attempt to build and run it, although it builds just fine, it immediately exits out with the message

Object::connect: No such slot QWidget::run()

Unless I did something wrong, Qt does not seem to be recognizing the slot run()

Could anyone please help?


Update:

The code is now:

class Window : public QWidget
{
    Q_OBJECT
public:
    Window(QWidget *parent = 0);

public slots:
    void run();

private:
    //...
};

and

Window::Window(QWidget *parent) : QWidget(parent)
{
    //...

    connect(runBtn,SIGNAL(clicked()),this,SLOT(run()));

    //...
}
Window::run()
{
    //...
}

The program still "unexpectedly finished", but no longer tell me that there is no such thing as QWidget::run()

+6  A: 

Possibly you have forgotten a Q_OBJECT macro in your Window class?

class Window : public QWidget
{
Q_OBJECT
public:
    Window()
...
drhirsch
Apparently, yes I have. After I added it, though, it still crashed immediately, and exited with code 0.
Austin Hyde
@Austin, don't forget to re-run qmake after doing this, as it will need to add your file to the list of items to run the MOC on, which will also affect the behavior at runtime.
Caleb Huitt - cjhuitt
Do you have a stacktrace? Anyway, I recommend reading the Qt tutorials, which are part of the Qt Documentation. They are very well written and go step by step. Additionally there are a lot of examples for the use of the most common classes which are worth a look too.
drhirsch
I am using the qt creator IDE, so (I believe) it does this automatically on build. I ran qmake manually, but it is still crashing, minus the error about "No such slot".
Austin Hyde
@drhirsch I have indeed read through the tutorials, and have even gone as far to skim some of the documentation and look at all the pertinent examples.
Austin Hyde
@Austin, if you are using QtCreator, you should be able to debug the application and see what is going on when it crashes. More information would be very helpful on this on.
Caleb Huitt - cjhuitt
+1  A: 

What is runBtn, and how is it created? If it's created as part of a ui file, are you calling setupUi()? How is your window class being created? You seem to have omitted some code (// ...) which may be where the error is.

The best advice I can give to to try and reduce your problem to a very small compilable example. This helps for two reasons:

  1. It helps you diagnose the problem, since there'll be less code to look at.
  2. If you still need our help, it'll help us since we will have a complete codebase we can download, compile and debug. Often the problem is not where you think it is.

Hope this helps.

Thomi
A: 

Looks like runBtn is not instantiated at the time connect is called -- as implied by one of the other answers.

Use breakpoints to check where the crash is happening.

Sam Dutton
A: 

Has anyone found the ans for this problem??..Im stuck on this one too...damn irritating...please reply if u do hv any updates...

Shantanu Daithankar
The solution that worked for me is the accepted one for the question. It will show up as the first answer for the question with a green check mark. If this did not fix your problem, you should ask a new question, as you're not having the same problem I had.
Austin Hyde
Oh, and you should probably delete your "answer" because it's not an "answer". On SO, Each "answer" serves as a solution to the problem or question posed in the "question". Discussions go in the comments, like I'm doing now. Welcome to SO!
Austin Hyde
My apologies Austin Hyde...new to these forums and was not conscious of the protocol tht was followed...
Shantanu Daithankar
A: 

Well I was having this problem too and could find no help on-line. I found out that I was forgetting to delete the moc_* files before recompiling and it was using the old moc files to create the executable file. This caused it to not know about any new slots I had coded. I would check that if all the rest of these suggestions failed.

Sometimes the simplest solution is the best solution...

Brett