0

コンボボックスの値とラベルを接続して、コンボボックスが変更されたときにラベルがそれを反映するようにしようとしています。私は答えを見つけようと心をググってみましたが、今のところ、何も機能していません。それでもエラーが発生します:no matching function for call to mainWindow::connect(QComboBox*&, const char [38], QString*, const char [26])

QObject::connect私はQtを扱った他のQWidget::connect何かを試しましたが、役に立ちませんでした。

コンボボックスの値を示すラベルを作成することは、プログラムの最終的な意図ではありません。むしろ、単純なラベルで機能させてから、表示したいものに変更したいと思います(したがってtempLabel)。

mainwindow.h:

class MainWindow : public QMainWindow
{
public:
    MainWindow();

private slots:
    QString getClass(QComboBox *box);
};

mainwindow.cpp:

MainWindow::MainWindow()
{
    QString qMathClassName;

    QComboBox* mathClassCombo = new QComboBox;
    QLabel* label = new QLabel(qMathClassName);

    // omitting layout code...

    connect(mathClassCombo, SIGNAL(currentIndexChanged(const QString &)), 
            &qMathClassName, SLOT(getClass(mathClassCombo)));
}

QString MainWindow::getClass(QComboBox *box)
{
    return box->currentText();
}

どんな助けでも大歓迎です!

4

2 に答える 2

2

Qtのシグナルとスロットのドキュメントを読む必要があると思います。繰り返しますが、すでにそうしている場合。それらの例に特に注意してください。

C++のQtについて次のような誤解があったと思います。

  1. そのQLabelはQStringへの参照を取り、その文字列が変更されたときにテキストを更新します。そうではありません。QLabelは、文字列を指定すると、文字列の値を表示します。更新されるのはそれだけです。

  2. スタック上に構築されたオブジェクトは、関数の終了時に破棄されません。彼らはしません。コンストラクターの最後で、qMathClassNameは破棄され、それへの参照は無効になります。したがって、可能であっても、それに接続することは望ましくありません。

  3. QObject :: connectの3番目の引数は、スロットの戻り値を置く場所へのポインターです。そうではありません。3番目の引数は、スロットを呼び出すQObjectへのポインターです。スロットの戻り値は、QObject::connectを介してスロットに対して行われた呼び出しには使用されません。

  4. 接続のスロットに値をバインドできること。残念ながら違います。SLOTマクロ内に、スロットの関数シグネチャを配置する必要があります。変数を参照することはできません。引数セクションには、クラス名のみを含める必要があります。つまりSLOT(getClass(QComboBox*))、ではありませんSLOT(getClass(mathClassCombo))

コンボボックスの内容がラベルに表示されるようにする最も簡単な方法は次のとおりです。

QComboBox* mathClassCombo = new QComboBox;
QLabel* tempLabel = new QLabel;
connect(mathClassCombo, SIGNAL(currentIndexChanged(const QString&)), 
        tempLabel, SLOT(setText(const QString&)));

もっと複雑なことをしたい場合は、それらの複雑さを処理できるスロットをウィンドウに作成することをお勧めします。例えば:

mainwindow.h:

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
    MainWindow();

private slots:
    void updateLabelText(const QString& className);

private:
    QComboBox* mathClassCombo;
    QLabel* tempLabel;
}

mainwindow.cpp:

MainWindow::MainWindow()
{
    mathClassCombo = new QComboBox;
    tempLabel = new QLabel;

    // omitting layout code...

    connect(mathClassCombo, SIGNAL(currentIndexChanged(const QString&)), 
            this, SLOT(updateLabelText(const QString&)));
}

void MainWindow::updateLabelText(const QString& className)
{
    QString newLabelString = className + " is the best class ever!";
    tempLabel->setCurrentText(newLabelString);
}
于 2012-07-21T07:40:46.797 に答える
2

信号を別のシグネチャを持つスロットに接続しています。スロットを次のように変更する必要があります

getClass(const QString &)

信号に合わせcurrentIndexChangedます。

于 2012-07-20T00:04:44.787 に答える