• 5839阅读
  • 6回复

求助贴,关于信号和槽的 [复制链接]

上一主题 下一主题
离线sdyansong
 

只看楼主 倒序阅读 楼主  发表于: 2013-08-12
我想创建两个窗口,一个窗口单击按钮,另一个窗口做相应的反应。我成功的创建了2个窗口mainwidow和menu,我在menu窗口单击按钮是,用emit函数发射了信号,可是在mainwindow窗口显示没有这个信号,我是新人,c++也不是很好,请各位大神给指导下,我在这个地方困住有四五天了,实在是没有办法了,跪求大神指导。最主要的是mainwindow。cpp函数里面的connect函数,我那个地方应该是写错了,您看下怎么改,有人说定义两个类指针,如果可以请您给我指导一下,谢谢





mainwindo。h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

//#include "ui_mainwindow.h"
#include <QDialog>
#include <QWidget>
#include <QTranslator>

#include "draw.h"

#include "menu.h"

#include <iostream>
using namespace std;
class QPushButton;
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
   // void butTon(QWidget *);
    void paintEvent(QPaintEvent *);

protected:

    Menu* w;

protected slots:

    // 父窗口用于接收子窗口信号的slot。
    void Button_clicked()
    {
        cout << "hello mainwindows" <<endl;
        //子窗口的按钮被点击了。
    }
};

#endif // MAINWINDOW_H//项目横向横坐标



mainwindow。cpp



#include "mainwindow.h"
//#include "ui_mainwindow.h"
#include <QPainter>
#include <iostream>

#include <QMessageBox>

#include <QApplication>
#include <QPixmap>
#include "picture.h"
#include <QtGui>

int LanNub = 78;


using namespace std;
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)
{
    setFixedSize(800,480);
    w = new Menu();
    connect(w,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));
}

MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *)
{
        // 画一条直线
        QPainter painter(this); // 创建QPainter一个对象
        QPen pen;
        //画横长线
        painter.drawLine(30,30,590,30);

        //画竖长线
        painter.drawLine(590,30,590,550);
        //画竖短线-横向
}


menu。h

#ifndef MENU_H
#define MENU_H

#include <QMainWindow>

class QPushButton;

class Menu : public QMainWindow
{
    Q_OBJECT
public:
    Menu(QWidget *parent = 0);

   void butTon(QWidget *);

signals:
   void ChildWindowEvent();


private:
    QPushButton *btn;

public slots:
    void btn_clicked();
};

#endif // MENU_H



menu。cpp

#include "menu.h"

#include <iostream>

//#include <QMessageBox>

#include <QApplication>
//#include <QPixmap>
#include "picture.h"
#include <QtGui>

class QPushbutton;

using namespace std;

Menu::Menu(QWidget *parent) :QMainWindow(parent)
{
    butTon(0);
    setFixedSize(300,200);
   // connect(pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()))
}


void Menu::butTon(QWidget *)
{
    cout << "hel" << endl;

    //QWidget *w = new QWidget(this);
    btn = new QPushButton("change picture",this);
   //btn->setGeometry(QRect(QPoint(630, 30),QSize(100, 30)));
   btn->setGeometry(QRect(QPoint(100, 50),QSize(130, 30)));
   /* QVBoxLayout *layout = new QVBoxLayout;// 这行有layout管理button大小
    layout->addWidget(btn);
    w->setLayout(layout);
    setCentralWidget(w);
    w->show();*/

    //setLayout(layout);
    connect(btn,SIGNAL(clicked()),this,SLOT(btn_clicked()));
}


void Menu::btn_clicked()
{
    cout << "hello butt" << endl;
    // 触发子窗口的信号给父窗口接收。
            emit ChildWindowEvent();
}




main。cpp


int main(int argc, char *argv[])


{  
QApplication a(argc, argv);  
MainWindow w;  
  w.show();  
  Menu m;
   m.show();
    //return m.exec();  
return a.exec();
}



离线sikylori

只看该作者 1楼 发表于: 2013-08-12
    这代码看得比较辛苦,你是创建了二个Menu对象,在main()函数内静态创建的没有跟Mainwindow对象相连,但它显示出来,你点击的就是这个Menu对象,而在Mainwindow构造函数中又动态创建了一个Menu对象,这个对象与Mainwindow对象相连了,但偏偏它就没有显示出来,所以你点击的是没有相连的Menu对象;基础有待提高,修改方法很多,下面改了一下mainwindow.cpp与main.cpp

mainwindow.cpp:


#include "mainwindow.h"
//#include "ui_mainwindow.h"
#include <QPainter>
#include <iostream>
#include <QMessageBox>
#include <QApplication>
#include <QPixmap>
//#include "picture.h"
#include <QtGui>
int LanNub = 78;

using namespace std;
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)
{
setFixedSize(800,480);
//  w = new Menu();
//  connect(w,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *)
{
// 画一条直线
QPainter painter(this); // 创建QPainter一个对象
QPen pen;
//画横长线
painter.drawLine(30,30,590,30);
//画竖长线
painter.drawLine(590,30,590,550);
//画竖短线-横向
}
void MainWindow::Button_clicked()
{
cout << "hello mainwindows" <<endl;
//子窗口的按钮被点击了。
}

main.cpp:


#include "signal.h"
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "menu.h"int main(int argc, char *argv[])
{
QApplication a(argc, argv);  
MainWindow w;  
w.show();  
  Menu m;
  m.show();
QObject::connect(&m, SIGNAL(ChildWindowEvent()), &w, SLOT(Button_clicked()));
return a.exec();
}

离线sdyansong

只看该作者 2楼 发表于: 2013-08-12
回 1楼(sikylori) 的帖子
先谢谢你,我看看你的代码
离线sdyansong

只看该作者 3楼 发表于: 2013-08-12
回 1楼(sikylori) 的帖子
您好,谢谢您,能问下你认为我需要加强哪方面的内容吗?是c++的还是qt的
离线sdyansong

只看该作者 4楼 发表于: 2013-08-12
回 1楼(sikylori) 的帖子
谢谢你
离线sikylori

只看该作者 5楼 发表于: 2013-08-13
最主要还是C/C++的基础,再学习QT就事半功倍了
离线neil-wen

只看该作者 6楼 发表于: 2013-08-14
有丰富C经验,缺乏C++经验的: 《C++ Primer (3RD)》 有其他语言的丰富经验的: 《The C++ Programming Language》简称TCPL如果选择薄一点的书:《Essential C++》《Accelerated C++》都是不错的选择


《Effective C++》 简称EC,C++程序员必读!


《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》简称《C++ 编程规范》


《More Effective C++》简称MEC


新书《Exceptional C++ Style》也是值得一看的好书。


《The C++ Standard Library》听说过STL吗?这本书会教你最基本的,也是最重要的STL的使用。


《The Art Of C++》
快速回复
限100 字节
 
上一个 下一个