0

我正在尝试连接组合框值和标签,以便在组合框更改时标签反映这一点。我已经用谷歌搜索了我的心,试图找到答案,但到目前为止,还没有任何效果;我仍然收到错误:no matching function for call to mainWindow::connect(QComboBox*&, const char [38], QString*, const char [26])

我已经尝试过QObject::connectQWidget::connect以及其他任何与 Qt 打交道的东西,但都无济于事。

创建一个表示组合框值的标签并不是我对该程序的最终意图。相反,我希望让它使用一个简单的标签,然后将其更改为我希望它显示的内容(因此是tempLabel)。

主窗口.h:

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

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

主窗口.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

您正在将信号连接到具有不同签名的插槽。您必须将您的插槽更改为类似

getClass(const QString &)

匹配currentIndexChanged信号。

于 2012-07-20T00:04:44.787 回答
2

我认为您需要阅读 Qt 的信号和插槽文档。同样,如果你已经这样做了。特别注意他们的例子。

我认为您对 C++ 中的 Qt 有以下误解:

  1. 那个 QLabel 引用了一个 QString,并且当那个字符串改变时它会更新它的文本。它不会。当你给它字符串时,QLabel 将显示字符串的值。那是它唯一会更新的时间。

  2. 在堆栈上构造的对象不会在函数结束时被销毁。他们不会。在构造函数结束时, qMathClassName 将被销毁,并且对它的任何引用都将变为无效。因此,即使可以,您也不想与它建立联系。

  3. QObject::connect 的第三个参数是一个指向放置槽返回值的位置的指针。它不是。第三个参数是指向要在其上调用槽的 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&)));

如果您想做一些更复杂的事情,我建议您在窗户上制作一个可以处理这些复杂情况的插槽。例如:

主窗口.h:

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

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

private:
    QComboBox* mathClassCombo;
    QLabel* tempLabel;
}

主窗口.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 回答