首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT:没有这样的插槽/如何创建新的makefile?

QT:没有这样的插槽/如何创建新的makefile?
EN

Stack Overflow用户
提问于 2013-04-22 21:17:02
回答 1查看 1.1K关注 0票数 0

嘿,我整个晚上都在找答案,却找不到答案。我的QT创建者应用程序中有以下错误。我将把我的主机窗口.h,我的main.cpp和我的mainwindow.cpp也发给你,我找到了一些答案,我必须重新生成一些文件,因为编译器doas不是自己做的,并且在帮助中找到了一些命令(例如qmake -tp vc projectname.pro),但是它没有工作:(所以请帮助我几乎哭:我只想在每个插槽中更改主窗口的中心部件;)

错误

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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();
}

编辑

这是我用一个创建者和一个qwidget类的3个插槽编写的新代码,我将其添加到main.cpp的主窗口中。我仍然得到一个错误,映射的插槽(a,b,c)不存在。请帮助:d greez

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 2013-04-22 21:29:43

您只能连接兼容的信号和插槽。不通过“兼容性”深入了解细节,您可以考虑类似的参数(按数量和类型进行匹配)。

在您的情况下,您正在尝试连接两个不兼容的事物。信号: void ()和槽: void (QWidget*小部件);

如果希望保持这种状态,则需要QSignalMapper将单击的()映射到您的方法。就像这样:

代码语言:javascript
复制
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);
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16156880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档