2

我在当前正在编写的程序中遇到连接问题。我首先创建了一个“主窗口”对话框,其中包含按钮、行编辑等(这些都与我的自定义插槽完美配合)。其中一个按钮(“添加类”按钮)应该创建一个新的弹出对话框,它是主窗口对话框的子对话框。我为这个新对话框(addClass.h 和 addClass.cpp)编写了一个新的 .h 和 .cpp。当我单击按钮时,对话框模式设置为 ApplicationModal 并且到目前为止,代码有效;当我单击“添加类”时,新对话框显示为一个弹出窗口,其中包含我想要的所有标签、行编辑和按钮。当我尝试使用这个新类使用连接时,问题就出现了。单击确定按钮后,不执行连接。程序正确编译(使用 qmake 然后 make)并且在运行时没有错误。我还从弹出对话框中获取了 .h 和 .cpp 文件,并用他们自己的 main.cpp 对其进行了测试,并且连接工作得很好。我对问题可能是什么感到困惑,所以任何帮助都会很棒!

以下是一些可能有用的代码片段:

在 mainWindow.cpp 中启动弹出对话框的自定义插槽(有效,我在 mainWindow.cpp 中包含“addClass.h”):

void mainWindow::addClassCombo(){
    addClass aC(win);
}

添加类.h:

#ifndef ADDCLASS_H
#define ADDCLASS_H

#include <QDialog>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QString>

class addClass : public QDialog{

    Q_OBJECT

public:
    addClass(QWidget *parent = 0);

private slots:
    void addToTxt();

private:
    QDialog *addMathClass;
    QVBoxLayout *mainLayout;
    QHBoxLayout *layoutOkCanc;
    QLabel *nameL;          //label for name of math class to be added
    QLineEdit *name;        //line edit for name
    QPushButton *ok;        //ok button
    QPushButton *canc;      //cancel button
};

#endif

addClass.cpp(与它自己的 main.cpp 一起使用,但不是与我的 mainWindow.cpp 一起使用):

#include <QtGui>
#include <QTextStream>

#include "addClass.h"

#include <iostream>

addClass::addClass(QWidget *parent):QDialog(parent){

    addMathClass = new QDialog(parent);

    mainLayout = new QVBoxLayout(addMathClass);
    layoutOkCanc = new QHBoxLayout();

    nameL = new QLabel("Math Class Name:");
    name = new QLineEdit;
    nameL->setBuddy(name);

    ok = new QPushButton("Ok");
    canc = new QPushButton("Cancel");

    QObject::connect(canc, SIGNAL(clicked()), addMathClass, SLOT(close()) ); //<-works
    QObject::connect(ok, SIGNAL(clicked()), this, SLOT(addToTxt()) );     //<-doesn't work
    QObject::connect(ok, SIGNAL(clicked()), addMathClass, SLOT(close()) );  //<-works

    layoutOkCanc->addStretch();
    layoutOkCanc->addWidget(ok);
    layoutOkCanc->addWidget(canc);

    mainLayout->addWidget(nameL);
    mainLayout->addWidget(name);
    mainLayout->addLayout(layoutOkCanc);

    addMathClass->setWindowModality(Qt::ApplicationModal);
    addMathClass->setWindowTitle("Add Class");
    addMathClass->show();
}

void addClass::addToTxt(){
    std::cout<<"testing"<<std::endl;
}
4

1 回答 1

1

addClass aC(win);的超出范围并正在被销毁。连接有效,但对象销毁后断开连接。这就是为什么你没有被调用插槽

于 2012-08-09T12:40:30.523 回答