0
votes

Hey I searched nearly the whole evening for an answer and couldn find one. I have following error in my QT creator application. I will post you my mainwindow.h , my main.cpp and my mainwindow.cpp too, i found some answers that i have to regenerate some files because the compiler doas not makes it on his own and found some commands (for example qmake -tp vc projectname.pro) in the help but it didn't worked :( so please help me im nearly crying :D I just want to change the central widget of the mainwindow per slot ;)

the error

QObject::connect: No such slot MainWindow::scW(mainwindow1)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scW(mainwindow2)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scW(mainwindow3)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scW(mainwindow1)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scW(mainwindow2)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scW(mainwindow3)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scW(mainwindow1)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scw(mainwindow2)
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::scW(mainwindow3)
QObject::connect:  (receiver name: 'MainWindow')

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void scW(QWidget *widget);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

void MainWindow::scW(QWidget *widget){
   this->setCentralWidget(widget);
}

MainWindow::~MainWindow()
{
    delete ui;
}

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow *w=new MainWindow;

        QWidget *mainwindow1=new QWidget;
        QWidget *mainwindow2=new QWidget;
        QWidget *mainwindow3=new QWidget;
        QGridLayout *gridlay1=new QGridLayout;
        QGridLayout *gridlay2=new QGridLayout;
        QGridLayout *gridlay3=new QGridLayout;
        QWidget *window11=new QWidget;
        QWidget *window21=new QWidget;
        QWidget *window31=new QWidget;
        QVBoxLayout *vblay1=new QVBoxLayout;
        QVBoxLayout *vblay2=new QVBoxLayout;
        QVBoxLayout *vblay3=new QVBoxLayout;
        QPushButton *button_eins1=new QPushButton("Menü 1");
        QPushButton *button_zwei1=new QPushButton("Menü 2");
        QPushButton *button_drei1=new QPushButton("Menü 3");
        QPushButton *button_eins2=new QPushButton("Menü 1");
        QPushButton *button_zwei2=new QPushButton("Menü 2");
        QPushButton *button_drei2=new QPushButton("Menü 3");
        QPushButton *button_eins3=new QPushButton("Menü 1");
        QPushButton *button_zwei3=new QPushButton("Menü 2");
        QPushButton *button_drei3=new QPushButton("Menü 3");

        vblay1->addWidget(button_eins1);
        vblay1->addWidget(button_zwei1);
        vblay1->addWidget(button_drei1);
        vblay2->addWidget(button_eins2);
        vblay2->addWidget(button_zwei2);
        vblay2->addWidget(button_drei2);
        vblay3->addWidget(button_eins3);
        vblay3->addWidget(button_zwei3);
        vblay3->addWidget(button_drei3);
        window11->setLayout(vblay1);
        window21->setLayout(vblay2);
        window31->setLayout(vblay3);

        gridlay1->addWidget(window11,0,0);
        gridlay2->addWidget(window21,0,0);
        gridlay3->addWidget(window31,0,0);

        //Untermenü1
        QWidget *window12=new QWidget;
        QVBoxLayout *vblay12=new QVBoxLayout;
        QLabel *label1=new QLabel("willkommen!");
        vblay12->addWidget(label1);
        window12->setLayout(vblay12);

        gridlay1->addWidget(window12,0,1);
        //Ende Untermenü1

        //Untermenü2
        QWidget *window22=new QWidget;
        QVBoxLayout *vblay22=new QVBoxLayout;
        QLabel *label2=new QLabel("Untermenü 1!");
        vblay22->addWidget(label2);
        window22->setLayout(vblay22);

        gridlay2->addWidget(window22,0,1);
        //Ende Untermenü

        //Untermenü3
        QWidget *window32=new QWidget;
        QVBoxLayout *vblay32=new QVBoxLayout;
        QLabel *label3=new QLabel("Untermenü 2!");
        vblay32->addWidget(label3);
        window32->setLayout(vblay32);

        gridlay3->addWidget(window32,0,1);
        //Ende Untermenü

        mainwindow1->setLayout(gridlay1);
        mainwindow2->setLayout(gridlay2);
        mainwindow3->setLayout(gridlay3);

        w->setCentralWidget(mainwindow1);

        QObject::connect(button_eins1,SIGNAL(clicked()),w,SLOT(scW(mainwindow1)));
        QObject::connect(button_zwei1,SIGNAL(clicked()),w,SLOT(scW(mainwindow2)));
        QObject::connect(button_drei1,SIGNAL(clicked()),w,SLOT(scW(mainwindow3)));
        QObject::connect(button_eins2,SIGNAL(clicked()),w,SLOT(scW(mainwindow1)));
        QObject::connect(button_zwei2,SIGNAL(clicked()),w,SLOT(scW(mainwindow2)));
        QObject::connect(button_drei2,SIGNAL(clicked()),w,SLOT(scW(mainwindow3)));
        QObject::connect(button_eins3,SIGNAL(clicked()),w,SLOT(scW(mainwindow1)));
        QObject::connect(button_zwei3,SIGNAL(clicked()),w,SLOT(scw(mainwindow2)));
        QObject::connect(button_drei3,SIGNAL(clicked()),w,SLOT(scW(mainwindow3)));
        w->show();

    return a.exec();
}

EDIT

This is a new Code i wrote with one creator and 3 Slots of a qwidget class i add to the main window in main.cpp.. I still get a error that the slots mapped(a,b,c dont exist. please help:D greez

#include "window1.h"
#include "window2.h"
#include "window3.h"
#include "window4.h"
#include <QPushButton>
#include <QSignalMapper>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QWidget>
#include <QObject>
#include <QLabel>

window1::window1(QWidget *parent) :
    QWidget(parent)
{
    int a=1,b=2,c=3;
    QWidget *menu_win=new QWidget;
    window3 *cont_two_win=new window3();
    window4 *cont_three_win=new window4();
    QPushButton *buttone_one=new QPushButton("one");
    QPushButton *buttone_two=new QPushButton("two");
    QPushButton *buttone_three=new QPushButton("three");
    QVBoxLayout *vblay=new QVBoxLayout;
    QGridLayout *gridlay=new QGridLayout;
    QSignalMapper *signalmapper=new QSignalMapper();

    vblay->addWidget(buttone_one);
    vblay->addWidget(buttone_two);
    vblay->addWidget(buttone_three);

    menu_win->setLayout(vblay);
    gridlay->addWidget(menu_win,0,0);
   // gridlay->addWidget(cont_win,0,1);
    this->setLayout(gridlay);

    QObject::connect(buttone_one,SIGNAL(clicked()),signalmapper,SLOT(map()));
    QObject::connect(buttone_two,SIGNAL(clicked()),signalmapper,SLOT(map()));
    QObject::connect(buttone_three,SIGNAL(clicked()),signalmapper,SLOT(map()));

    signalmapper->setMapping(buttone_one,a);
    signalmapper->setMapping(buttone_two,b);
    signalmapper->setMapping(buttone_three,c);

    QObject::connect(signalmapper,SIGNAL(mapped(a)),this,SLOT(change_cont_one(&gridlay)));
    QObject::connect(signalmapper,SIGNAL(mapped(b)),this,SLOT(change_cont_two(&gridlay)));
    QObject::connect(signalmapper,SIGNAL(mapped(c)),this,SLOT(change_cont_three(&gridlay)));
}

void window1::change_cont_one(QGridLayout **gridlay){
    window2 *cont_one_win=new window2();
    QLabel *label=new QLabel("Test1");
    QVBoxLayout *vblay=new QVBoxLayout;
    vblay->addWidget(label);
    cont_one_win->setLayout(vblay);
    (*gridlay)->addWidget(cont_one_win,0,1);
}

void window1::change_cont_two(QGridLayout **gridlay){
    window2 *cont_one_win=new window2();
    QLabel *label=new QLabel("Test2");
    QVBoxLayout *vblay=new QVBoxLayout;
    vblay->addWidget(label);
    cont_one_win->setLayout(vblay);
    (*gridlay)->addWidget(cont_one_win,0,1);
}


void window1::change_cont_three(QGridLayout **gridlay){
    window2 *cont_one_win=new window2();
    QLabel *label=new QLabel("Test3");
    QVBoxLayout *vblay=new QVBoxLayout;
    vblay->addWidget(label);
    cont_one_win->setLayout(vblay);
    (*gridlay)->addWidget(cont_one_win,0,1);
}
1
You cannot bind values like this in connect(), the arguments must be types, not variables.Frank Osterfeld
MainWindow instead of w Or which one do you mean? (:dadod2
Yes, the value of the MainWindow* argument must come from the signal (or use a signal mapper as evilruff describes), and cannot be specified at connect() time.Frank Osterfeld

1 Answers

1
votes

You can connect only compatible signals and slots. Without going deep in details by 'compatibility' you can consider similar parameters (matching by amount and type).

In your case you are trying to connect two incompatible things. signal: void clicked() and slot: void scW(QWidget *widget);

If you want to keep it like it is you need QSignalMapper to map clicked() to your method. something like this:

QSignalMapper * mapper = new QSignalMapper();

connect(mapper, SIGNAL(mapped(QWidget*)), w, SLOT(scW(QWidget*)));

connect(button_eins1,SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(button_eins1, mainwindow1);

connect(button_zwei1,SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(button_eins1, mainwindow2);
...