我遇到问题"信号和插槽"理解。以下是我的任务说明。
mainwindow
。这很简单,但我无法解决。
以下是我的代码:
#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);
}
我希望你能原谅这个新手的编码和理解风格。
答案 0 :(得分:3)
问题是您需要使用QLabel
访问器功能来更改文本值。 text()
是一个“吸气者”,而非“定位者”。
将MainWindow::setLabelValue()
更改为
MainWindow::setLabelValue()
{
ui->label->setText(ui->comboBox->currentText());
}
此外,您的连接不太正确。 setLabelValue
是MainWindow
的函数,而不是标签,因此请将连接更改为:
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);
}