找回密码
 立即注册
收起左侧

QT设计的多窗口切换,为何总是显示出来两个窗口

1
回复
8663
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2015-9-6 13:57:46 显示全部楼层 |阅读模式
5Qter豆

我设计多个窗口,然后切换。问题现象是点击按钮后总是每次出现两个相同窗口,而不是只有一个。窗口界面有QWidget类,也有Dialog类。代码如下:
main.cpp

  1. #include "widget_login.h"
  2. //#include "mainmenu.h"
  3. #include <QApplication>

  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication a(argc, argv);
  7.     Widget_Login w;

  8.     w.move(200, 200);
  9.     w.show();

  10.     return a.exec();
  11. }
复制代码

登录界面widget_login.h

  1. #include <QWidget>

  2. namespace Ui {
  3. class Widget_Login;
  4. }

  5. class Widget_Login : public QWidget
  6. {
  7.     Q_OBJECT

  8. public:
  9.     explicit Widget_Login(QWidget *parent = 0);
  10.     ~Widget_Login();

  11. private slots:
  12.     void on_pushButton_clicked();

  13. private:
  14.     Ui::Widget_Login *ui;

  15. };

  16. #endif // WIDGET_LOGIN_H
复制代码

widget_login.cpp

  1. #include "widget_login.h"
  2. #include "ui_widget_login.h"
  3. #include "dialog.h"
  4. #include "mainmenu.h"
  5. #include <iostream>
  6. #include <fstream>

  7. Widget_Login::Widget_Login(QWidget *parent) :
  8.     QWidget(parent),
  9.     ui(new Ui::Widget_Login)
  10. {
  11.     ui->setupUi(this);
  12.     connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
  13. }

  14. Widget_Login::~Widget_Login()
  15. {
  16.     delete ui;
  17. }

  18. void Widget_Login::on_pushButton_clicked()
  19. {
  20.      Mainmenu *menu = new Mainmenu();

  21.    this->close();
  22.    menu->show();

  23. }
复制代码

主界面mainmenu.h

  1. #ifndef MAINMENU_H
  2. #define MAINMENU_H

  3. #include <QWidget>
  4. #include "oper_window.h"

  5. namespace Ui {
  6. class Mainmenu;
  7. }

  8. class Mainmenu : public QWidget
  9. {
  10.     Q_OBJECT

  11. public:
  12.     explicit Mainmenu(QWidget *parent = 0);
  13.     ~Mainmenu();

  14. private slots:

  15.     void on_pushButton_SET_clicked();

  16.     void on_pushButton_CHECK_clicked();

  17.     void on_pushButton_OPERATION_clicked();

  18.     void on_pushButton_REPLAY_clicked();

  19. private:
  20.     Ui::Mainmenu *ui;

  21. };

  22. #endif // MAINMENU_H
复制代码

mainmenu.cpp

  1. #include "mainmenu.h"
  2. #include "ui_mainmenu.h"
  3. #include "widget_login.h"

  4. Mainmenu::Mainmenu(QWidget *parent) :
  5.     QWidget(parent),
  6.     ui(new Ui::Mainmenu)
  7. {
  8.     ui->setupUi(this);
  9.     connect(ui->pushButton_SET, SIGNAL(clicked()), this, SLOT(on_pushButton_SET_clicked()));
  10.     connect(ui->pushButton_CHECK, SIGNAL(clicked()), this, SLOT(on_pushButton_CHECK_clicked()));
  11.     connect(ui->pushButton_OPERATION, SIGNAL(clicked()), this, SLOT(on_pushButton_OPERATION_clicked()));
  12.     connect(ui->pushButton_REPLAY, SIGNAL(clicked()), this, SLOT(on_pushButton_REPLAY_clicked()));
  13. }

  14. Mainmenu::~Mainmenu()
  15. {
  16.     delete ui;
  17. }

  18. void Mainmenu::on_pushButton_SET_clicked()
  19. {
  20.     Widget_Login *wi = new Widget_Login;
  21.     this->close();
  22.     wi->show();

  23. }

  24. void Mainmenu::on_pushButton_CHECK_clicked()
  25. {

  26. }

  27. void Mainmenu::on_pushButton_OPERATION_clicked()
  28. {

  29. }

  30. void Mainmenu::on_pushButton_REPLAY_clicked()
  31. {

  32. }
复制代码

最佳答案

查看完整内容

问题的原因: 你的问题应该是信号和槽重复关联的两次 你使用的是ui文件,包含了#include "ui_widget_login.h"头文件,在头文件里面会根据objectname自动关联一次on_pushButton_clicked()槽,然后你又自己添加了 connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));就相当于关联两次,所以你点击一次pushButton,会触发两次槽。 解决方案: 第一种,删除 connect(ui->pushButton, SIGNAL(clicked() ...
回复

使用道具 举报

累计签到:16 天
连续签到:1 天
2015-9-6 13:57:47 显示全部楼层
本帖最后由 更好 于 2015-9-18 17:00 编辑

问题的原因:
你的问题应该是信号和槽重复关联的两次
你使用的是ui文件,包含了#include "ui_widget_login.h"头文件,在头文件里面会根据objectname自动关联一次on_pushButton_clicked()槽,然后你又自己添加了 connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));就相当于关联两次,所以你点击一次pushButton,会触发两次槽。

解决方案:
第一种,删除 connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));这行代码。
第二种,槽函数的命名不要使用on_pushButton_clicked(),使用其他格式或其他名称,如btnClicked(),然后再自己手动关联信号和槽,connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btnClicked()));
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了