2

現在書いているプログラムの接続に問題があります。最初に、ボタン、行編集などを含む「メイン ウィンドウ」ダイアログを作成します (これらはすべて、カスタム スロットで完全に機能します)。ボタンの 1 つ (「クラスの追加」ボタン) は、mainWindow ダイアログの子である新しいポップアップ ダイアログを作成する必要があります。この新しいダイアログ用に新しい .h と .cpp を作成しました (addClass.h と addClass.cpp)。ボタンをクリックすると、ダイアログのモダリティが ApplicationModal に設定され、この時点までコードが機能します。「クラスの追加」をクリックすると、必要なすべてのラベル、行編集、およびボタンを含む新しいダイアログがポップアップとして表示されます。この新しいクラスを使用して接続を使用しようとすると、問題が発生します。[OK] ボタンをクリックしても、接続は実行されません。プログラムは (qmake を使用してから make を使用して) 適切にコンパイルされ、実行時にエラーは発生しません。また、ポップアップ ダイアログから .h および .cpp ファイルを取得し、それらを独自の main.cpp でテストしたところ、接続は完全に機能しました。問題が何であるかについて困惑しているので、どんな助けも素晴らしいでしょう!

役に立つかもしれないコードのスニペットを次に示します。

mainWindow.cpp でポップアップ ダイアログを開始するカスタム スロット (動作し、mainWindow.cpp に「addClass.h」を含めます):

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

addClass.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 に答える