Qt

时间:2015-09-29 14:46:41

标签: qt

我遇到问题"信号和插槽"理解。以下是我的任务说明。

  1. 从组合框中选择一个项目
  2. mainwindow
  3. 中的标签显示所选项目

    这很简单,但我无法解决。

    以下是我的代码:

    #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();
    
    signals:
        void activated(QString);
    
    private slots:
         void setLabelValue(const QString &text);
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H    
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect(ui->comboBox, &QComboBox::activated(QString),
                this, &MainWindow::setLabelValue(QString));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    MainWindow::setLabelValue(const QString &text)
    {
        //text = ui->comboBox->currentText();
    text = static_cast<void (QComboBox::*)(QString)>(ui->comboBox->currentText());
        ui->label->setText(text);
    }
    

    我希望你能原谅这个新手的编码和理解风格。

2 个答案:

答案 0 :(得分:3)

问题是您需要使用QLabel访问器功能来更改文本值。 text()是一个“吸气者”,而非“定位者”。

MainWindow::setLabelValue()更改为

MainWindow::setLabelValue()
{
    ui->label->setText(ui->comboBox->currentText());
}

此外,您的连接不太正确。 setLabelValueMainWindow的函数,而不是标签,因此请将连接更改为:

void (QComboBox::* activatedOverloadPtr)(const QString&) = &QComboBox::activated;
connect(ui->comboBox,activatedOverloadPointer, this, &MainWindow::setLabelValue);

使用激活的重载指针,以便编译器可以解析您要查找的特定activated连接。

完整的代码如下所示:

#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();

//signals: // this is defined by QComboBox, not you (in this case)
//    void activated(QString);

private slots:
     void setLabelValue(const QString &text);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H  

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    void (QComboBox::* activatedOverloadPtr)(const QString&) = &QComboBox::activated;
    connect(ui->comboBox,activatedOverloadPointer, this, &MainWindow::setLabelValue);
}

MainWindow::~MainWindow()
{
    delete ui;
}

MainWindow::setLabelValue()
{
    ui->label->setText(ui->comboBox->currentText());
}

答案 1 :(得分:-1)

感谢大家的支持。在下面的代码中,已经有效。

#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();

private slots:
     void setLabelValue(const QString &text);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->comboBox, static_cast<void (QComboBox::*)(const QString&)>(&QComboBox::activated), this,
            &MainWindow::setLabelValue);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::setLabelValue(const QString &text)
{
    ui->label->setText(text);
}