• 2991阅读
  • 4回复

[提问]多窗口的信号与槽 [复制链接]

上一主题 下一主题
离线karlchen
 

只看楼主 倒序阅读 楼主  发表于: 2017-02-08
建了两个窗体,一个是MainWindows,一个是Dialog。想实现在通过主窗口,可以打开Dialog,然后通过Dialog的一个按键,改变主窗口的一个Label的值。发现怎么也没反应,请高手给看看
  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. namespace Ui {
  5. class Dialog;
  6. }
  7. class Dialog : public QDialog
  8. {
  9.     Q_OBJECT
  10. public:
  11.     explicit Dialog(QWidget *parent = 0);
  12.     ~Dialog();
  13. protected:
  14.     void changeEvent(QEvent *e);
  15. private slots:
  16.     void on_pushButton_clicked();
  17. private:
  18.     Ui::Dialog *ui;
  19. signals:
  20.     void sig_1(QString str);
  21. };
  22. #endif // DIALOG_H


  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include "dialog.h"
  5. namespace Ui {
  6. class MainWindow;
  7. }
  8. class MainWindow : public QMainWindow
  9. {
  10.     Q_OBJECT
  11. public:
  12.     explicit MainWindow(QWidget *parent = 0);
  13.     ~MainWindow();
  14. private:
  15.     Ui::MainWindow *ui;
  16.     Dialog dlg;
  17. private slots:
  18.     void slotUpatelabel(QString str);
  19.     void on_pushButton_clicked();
  20. };
  21. #endif // MAINWINDOW_H


Mainwidows.cpp
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4.     QMainWindow(parent),
  5.     ui(new Ui::MainWindow)
  6. {
  7.     ui->setupUi(this);
  8.     connect(&dlg,SIGNAL(sig_1()),this,SLOT(slotUpatelabe()));
  9. }
  10. MainWindow::~MainWindow()
  11. {
  12.     delete ui;
  13. }
  14. void MainWindow::slotUpatelabel(QString str)
  15. {
  16.     ui->label->setText(str);
  17. }
  18. void MainWindow::on_pushButton_clicked()
  19. {
  20.     dlg.exec();
  21. }


dialog.cpp
  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4.     QDialog(parent),
  5.     ui(new Ui::Dialog)
  6. {
  7.     ui->setupUi(this);
  8. }
  9. Dialog::~Dialog()
  10. {
  11.     delete ui;
  12. }
  13. void Dialog::changeEvent(QEvent *e)
  14. {
  15.     QDialog::changeEvent(e);
  16.     switch (e->type()) {
  17.     case QEvent::LanguageChange:
  18.         ui->retranslateUi(this);
  19.         break;
  20.     default:
  21.         break;
  22.     }
  23. }
  24. void Dialog::on_pushButton_clicked()
  25. {
  26.     ui->pushButton->setText("Hello,world");
  27.     emit sig_1("hello,world");
  28. }


离线大漠之鹰

只看该作者 1楼 发表于: 2017-02-08
connect(&dlg,SIGNAL(sig_1()),this,SLOT(slotUpatelabe()));
这句话里的信号和槽都需要参数类型吧
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
离线karlchen

只看该作者 2楼 发表于: 2017-02-10
加了也一样. connect(&dlg,SIGNAL(sig_1(QString)),this,SLOT(slotUpatelabe(QString)));
离线steinlee

只看该作者 3楼 发表于: 2017-02-10
dialog要定义成pointer, GUI应用里使用垃圾收集器,要习惯用pointer, 否则你会有很多意想不到的问题


Looking for remote C/C++ and Qt 兼职
离线karlchen

只看该作者 4楼 发表于: 2017-02-13
回 steinlee 的帖子
steinlee:dialog要定义成pointer, GUI应用里使用垃圾收集器,要习惯用pointer, 否则你会有很多意想不到的问题
 (2017-02-10 14:59) 

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