2013-10-16 111 views
1

我想从第二个窗口的第一个窗口中的标签中更新文本,其中是行编辑以写入一些文本。这个文本应该在第一个窗口显示。 我花了一个星期的时间。 着名的连接不起作用。 是否有人在代码下面更正并解释连接应该如何工作? 我使用Qt版本5.1.1 Qt信号插槽不工作

firstwindow.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 

secondwindow.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 

的main.cpp

#include "firstwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Firstwindow w; 
    w.show(); 

    return a.exec(); 
} 

firstwindow.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); 

    } 
} 

secondwindow.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(); 
} 
+2

通常所说的:当调试可执行文件正在运行时,如果连接失败,Qt总是在输出窗口中写入一行。该行通常包含详细信息,说明连接失败的原因。 如果调试SIGNAL/SLOT连接,可能非常有用;) – tebe

+0

无法将参数1从'QLineEdit'转换为'const QObject *' – user2885147

+1

您在哪里初始化您的'SecondWindow'类中的'QLineEdit'对象?即'lineEdit = new QLineEdit(this)'。它是一个空指针,处于当前状态。还是应该指向'ui-> lineEdit'对象? – thuga

回答

3

我看到了以下问题:

  • QLineEdit的没有信号textChanged()。应该是textChanged(const QString &)。所以,你必须安装您的连接,如:

    QObject::connect(asecondwindow->lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(addEntry(const QString &))); 
    

    请注意,我改变了Firstwindow::addEntry()插槽Firstwindow::addEntry(const QString &)匹配信号的签名。

  • 我找不到您的QLineEdit成员变量Secondwindow类的创建时间和地点。

+0

无法将参数1从'QLineEdit'转换为'const QObject *' – user2885147

+0

@ user2885147:尝试在源文件(发生错误的位置)的顶部添加'#include '。 – vahancho

+0

没有什么变化。还是这个相同的错误。 – user2885147

1

有一个基本的设计问题,你在做什么。没有必要将第二个窗口的内部属性暴露给第一个窗口。只需在第二个窗口中监听变化,并在变化时发出信号。然后,第一个窗口可以只听第二个窗口上的更改。

下面是一个完整的例子,显示我的意思。 main.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。