QT: Нет такого слота / как создать новый make-файл?

Эй, я искал ответ почти весь вечер и не смог его найти. У меня следующая ошибка в моем приложении для создания QT. Я отправлю вам свой mainwindow.h, мой main.cpp и мой mainwindow.cpp тоже, я нашел несколько ответов, что мне нужно регенерировать некоторые файлы, потому что компилятор не делает это самостоятельно и нашел некоторые команды (например, qmake - tp vc projectname.pro) в справке, но это не сработало :( так что, пожалуйста, помогите мне, я почти плачу: D Я просто хочу изменить центральный виджет главного окна на слот;)

ошибка

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

ИЗМЕНИТЬ

Это новый код, который я написал с одним создателем и 3 слотами класса qwidget, которые я добавляю в главное окно в main.cpp .. Я все еще получаю сообщение об ошибке, что слоты сопоставлены (a, b, c не существуют. Пожалуйста, помогите: 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);
}

person dadod2    schedule 22.04.2013    source источник
comment
Вы не можете привязать такие значения в connect (), аргументы должны быть типами, а не переменными.   -  person Frank Osterfeld    schedule 23.04.2013
comment
MainWindow вместо w Или что вы имеете в виду? (:   -  person dadod2    schedule 23.04.2013
comment
Да, значение аргумента MainWindow * должно поступать из сигнала (или использовать преобразователь сигналов, как описывает злорафф), и его нельзя указать во время connect ().   -  person Frank Osterfeld    schedule 23.04.2013


Ответы (1)


Вы можете подключать только совместимые сигналы и слоты. Не вдаваясь в подробности «совместимости», можно рассмотреть аналогичные параметры (соответствие по количеству и типу).

В вашем случае вы пытаетесь соединить две несовместимые вещи. сигнал: void clicked () и слот: void scW (QWidget * widget);

Если вы хотите сохранить его в таком виде, вам понадобится QSignalMapper для сопоставления clicked () с вашим методом. что-то вроде этого:

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);
...
person evilruff    schedule 22.04.2013
comment
Хорошо, спасибо за Thema quick, и я попробую это. Но если бы возникла другая ошибка, например, несовместимый слот или параметр? - person dadod2; 23.04.2013
comment
Привет, я попробовал картограф, но все еще есть ошибка, я отредактировал свой вопрос новым кодом: / - person dadod2; 24.04.2013