Qt信号槽不工作
Qt signal-slot not working
我想从第二个窗口更新第一个窗口中标签中的文本,其中行编辑以写入一些文本。此文本应显示在第一个窗口中。我花了一个星期的时间。著名的连接不起作用。是否有人纠正以下代码并解释连接应该如何工作?我在 5.1.1 版中使用 Qt
第一窗口.h
#ifndef FIRSTWINDOW_H
#define FIRSTWINDOW_H
#include <QMainWindow>
#include "secondwindow.h"
namespace Ui {
class Firstwindow;
}
class Firstwindow : public QMainWindow
{
Q_OBJECT
public:
explicit Firstwindow(QWidget *parent = 0);
~Firstwindow();
public slots:
void addEntry();
private slots:
void on_pushButton_clicked();
private:
Ui::Firstwindow *ui;
Secondwindow *asecondwindow;
Secondwindow *absecondwindow;
Secondwindow *abcsecondwindow;
};
#endif // FIRSTWINDOW_H
第二窗口.h
#ifndef SECONDWINDOW_H
#define SECONDWINDOW_H
#include <QDialog>
#include <QtWidgets>
namespace Ui {
class Secondwindow;
}
class Secondwindow : public QDialog
{
Q_OBJECT
public:
explicit Secondwindow(QWidget *parent = 0);
~Secondwindow();
QLineEdit *lineEdit;
private slots:
void on_pushButton_clicked();
private:
Ui::Secondwindow *ui;
QPushButton *pushButton;
};
#endif // SECONDWINDOW_H
主.cpp
#include "firstwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Firstwindow w;
w.show();
return a.exec();
}
第一个窗口.cpp
#include "firstwindow.h"
#include "ui_firstwindow.h"
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
Firstwindow::Firstwindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Firstwindow)
{
ui->setupUi(this);
asecondwindow = new Secondwindow();
QObject::connect(asecondwindow->lineEdit,SIGNAL(textChanged()),this, SLOT(addEntry()));
}
Firstwindow::~Firstwindow()
{
delete ui;
delete asecondwindow;
delete absecondwindow;
delete abcsecondwindow;
}
void Firstwindow::on_pushButton_clicked()
{
absecondwindow = new Secondwindow;
absecondwindow->exec();
}
void Firstwindow::addEntry()
{
abcsecondwindow = new Secondwindow;
if (abcsecondwindow->exec()) {
QString name = abcsecondwindow->lineEdit->text();
ui->label->setText(name);
}
}
第二个窗口.cpp
#include "secondwindow.h"
#include "ui_secondwindow.h"
#include <QDialog>
Secondwindow::Secondwindow(QWidget *parent) :
QDialog(parent),
ui(new Ui::Secondwindow)
{
ui->setupUi(this);
}
Secondwindow::~Secondwindow()
{
delete ui;
}
void Secondwindow::on_pushButton_clicked()
{
// emit ui->lineEdit->textChanged();
QDialog::accept();
}
我看到以下问题:
-
QLineEdit 没有信号
textChanged()
。它应该是textChanged(const QString &)
的。因此,您必须像以下方式安装连接:QObject::connect(asecondwindow->lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(addEntry(const QString &)));
请注意,我将
Firstwindow::addEntry()
插槽更改为Firstwindow::addEntry(const QString &)
以匹配信号的签名。 -
我找不到创建
Secondwindow
类的 QLineEdit 成员变量的时间和地点。
你正在做的事情有一个基本的设计问题。无需向第一个窗口公开第二个窗口的内部属性。只需在第二个窗口中侦听变化,并在它发生变化时发出信号。然后第一个窗口可以只侦听第二个窗口上的更改。
这是一个完整的示例,显示了我的意思。主.cpp:
#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
class SecondWindow : public QDialog {
Q_OBJECT
public:
SecondWindow(QMainWindow *parent = 0) : QDialog(parent) {
QLineEdit *edit = new QLineEdit;
QPushButton *close = new QPushButton(QStringLiteral("close"));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(edit);
layout->addWidget(close);
setLayout(layout);
connect(edit, SIGNAL(textChanged(QString)), this, SIGNAL(textChanged(QString)));
connect(close, SIGNAL(clicked()), this, SLOT(close()));
}
signals:
void textChanged(const QString &text);
};
class FirstWindow : public QMainWindow {
Q_OBJECT
public:
FirstWindow(QMainWindow *parent = 0) : QMainWindow(parent) {
QWidget *central = new QWidget(this);
QPushButton *button = new QPushButton(QStringLiteral("Open"));
label = new QLabel(QStringLiteral("Output appears here"));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button);
layout->addWidget(label);
central->setLayout(layout);
setCentralWidget(central);
connect(button, SIGNAL(clicked()), this, SLOT(createWindow()));
}
private slots:
void createWindow() {
SecondWindow *window = new SecondWindow(this);
connect(window, SIGNAL(textChanged(QString)), this, SLOT(setLabelText(QString)));
window->resize(300, 300);
window->exec();
}
void setLabelText(const QString &text) {
label->setText(text);
}
private:
QLabel *label;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FirstWindow w;
w.resize(400, 400);
w.show();
return a.exec();
}
#include "main.moc"
并不是说 SecondWindow 侦听 QLineEdit 上的更改,并在该值更改时发出自己的信号。然后,FirstWindow只是连接到该信号,并在收到信号时更改自己的QLabel。
相关文章:
- C++ 信号和插槽不工作:插槽不响应事件
- QObjects 被移动到 QThreads 后信号不再工作
- QSerialPort readyRead() 信号无法正常工作
- boost信号和插槽在不同的线程中不工作(使用boost::asio::io_service)
- Qt5 多线程:信号仅单向工作
- 将信号从工作线程类连接到控制器类 - QThreads
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 如何向其他节点发出信号,表明主节点没有更多工作可用
- 将工作线程信号与主窗口插槽 (Qt5) 连接时出错
- 为什么我的工作人员线程未收到此信号
- 默认情况下,从工作线程发出Qt::信号会使主线程上的UI更新?
- 信号处理程序和图书馆工作人员线程
- Qt:信号插槽不工作
- 如果堆分配的对象被销毁并且指针被重新分配,Qt的信号和插槽系统会工作吗?
- 发出信号无法正常工作
- 如何将信号连接到boost :: asio :: io_service在其他线程上发布工作时
- qt qudpsocket:readyread()信号和相应的插槽无法正常工作
- 互斥信号量是如何工作的
- pthread_cond_wait/信号和互斥锁无法按预期工作
- Qt信号槽不工作