查看完整版本: [-- 多窗口的信号与槽 --]

QTCN开发网 -> Qt基础编程 -> 多窗口的信号与槽 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

karlchen 2017-02-08 16:26

多窗口的信号与槽

建了两个窗体,一个是MainWindows,一个是Dialog。想实现在通过主窗口,可以打开Dialog,然后通过Dialog的一个按键,改变主窗口的一个Label的值。发现怎么也没反应,请高手给看看
  1. #ifndef DIALOG_H
    #define DIALOG_H

    #include <QDialog>

    namespace Ui {
    class Dialog;
    }

    class Dialog : public QDialog
    {
        Q_OBJECT

    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();

    protected:
        void changeEvent(QEvent *e);

    private slots:
        void on_pushButton_clicked();

    private:
        Ui::Dialog *ui;

    signals:
        void sig_1(QString str);

    };

    #endif // DIALOG_H


  1. #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include "dialog.h"

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();

    private:
        Ui::MainWindow *ui;
        Dialog dlg;

    private slots:
        void slotUpatelabel(QString str);

        void on_pushButton_clicked();
    };

    #endif // MAINWINDOW_H


Mainwidows.cpp
  1. #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);

        connect(&dlg,SIGNAL(sig_1()),this,SLOT(slotUpatelabe()));

    }

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

    void MainWindow::slotUpatelabel(QString str)
    {
        ui->label->setText(str);
    }

    void MainWindow::on_pushButton_clicked()
    {
        dlg.exec();
    }


dialog.cpp
  1. #include "dialog.h"
    #include "ui_dialog.h"

    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
    }

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

    void Dialog::changeEvent(QEvent *e)
    {
        QDialog::changeEvent(e);
        switch (e->type()) {
        case QEvent::LanguageChange:
            ui->retranslateUi(this);
            break;
        default:
            break;
        }
    }

    void Dialog::on_pushButton_clicked()
    {
        ui->pushButton->setText("Hello,world");
        emit sig_1("hello,world");
    }



大漠之鹰 2017-02-08 17:40
connect(&dlg,SIGNAL(sig_1()),this,SLOT(slotUpatelabe()));
这句话里的信号和槽都需要参数类型吧

karlchen 2017-02-10 14:35
加了也一样. connect(&dlg,SIGNAL(sig_1(QString)),this,SLOT(slotUpatelabe(QString)));

steinlee 2017-02-10 14:59
dialog要定义成pointer, GUI应用里使用垃圾收集器,要习惯用pointer, 否则你会有很多意想不到的问题



karlchen 2017-02-13 16:40
steinlee:dialog要定义成pointer, GUI应用里使用垃圾收集器,要习惯用pointer, 否则你会有很多意想不到的问题
 (2017-02-10 14:59) 

多谢提醒,但是我发现我的问题不是这个,如果不定义成指针也可以。QT的编译器不能检查connect里面SLOT的函数名,我的问题是那个函数名少了一个l,低级错误。


查看完整版本: [-- 多窗口的信号与槽 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled