• 7018阅读
  • 16回复

找了一上午问题了,实在是不知道错在哪啊,请帮忙给看看 [复制链接]

上一主题 下一主题
离线sdyansong
 

只看楼主 倒序阅读 楼主  发表于: 2013-08-08
mainwindow。h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//#include "ui_mainwindow.h"
#include <QDialog>
#include <QWidget>
#include <QTranslator>
#include "picture.h"
#include "draw.h"
class QPushButton;class MainWindow : public QMainWindow
{
    Q_OBJECT
public:  
MainWindow(QWidget *parent = 0);
    ~MainWindow();
   void butTon(QWidget *);  
  void paintEvent(QPaintEvent *);


private slots:    
void Button_clicked();
private:  
PictureChange *w;
};
#endif // MAINWINDOW_H//项目横向横坐标

mainwindow。cpp
#include "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)
{
    butTon(0);  
setFixedSize(800,480);
}


MainWindow::~MainWindow(){}




/*
void MainWindow::butTon(QWidget *){    cout << "hel ew" << endl;*    QWidget *w = new QWidget(this);    Button = new QPushButton("change picture",this);   Button->setGeometry(QRect(QPoint(630, 30),QSize(100, 30)));   / QVBoxLayout *layout = new QVBoxLayout;// 这行有layout管理button大小    layout->addWidget(Button);    w->setLayout(layout);    setCentralWidget(w);    w->show();/    //setLayout(layout);    connect(Button,SIGNAL(clicked()),this,SLOT(Button_clicked()));/    }
*/
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(QWidget *)
{    
cout << "hello but" << endl;
  //w = new PictureChange(this);
   connect(this,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));  
cout << "sdfsdf" <<endl;}

void MainWindow::Button_clicked()
{  
cout << "hello butt" << endl;  
}




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 *);
private:    QPushButton *btn;
//private slots:  //  void btn_clicked();
signals:
    // 这个信号是发给父窗口的。    
void ChildWindowEvent();

protected slots:
    // 点击子窗口中按钮的slot    
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 *)
{
    //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 << "send" << endl;  
     //触发子窗口的信号给父窗口接收。    
emit ChildWindowEvent();
}

我在menu.h里面定义了一个自定义信号和槽,但是mainwindow。cpp提示没有那个信号,能帮忙给看看吗
离线sdyansong

只看该作者 1楼 发表于: 2013-08-08
错误提示:Object::connect: No such signal MainWindow::ChildWindowEvent()
离线jdwx

只看该作者 2楼 发表于: 2013-08-08
回 1楼(sdyansong) 的帖子
ChildWindowEvent声明在menu类里,
看下面,connect写在mainwindow类里,注意发射信号的类写的是:this
void MainWindow::butTon(QWidget *)
{    
cout << "hello but" << endl;
  //w = new PictureChange(this);
   connect(this,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));  

结果:当然mainwindow类里没有ChildWindowEvent信号。提示就是这个意思。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线sdyansong

只看该作者 3楼 发表于: 2013-08-08
回 2楼(jdwx) 的帖子
那我如果在mainwindow里面接受ChildWindowEvent信号怎么办啊,emit函数怎么才能给特定的槽发送信号啊,是不是给所有的槽都发,
离线sdyansong

只看该作者 4楼 发表于: 2013-08-08
回 2楼(jdwx) 的帖子
哦,发射信号的类,那这个地方怎么改啊
离线jdwx

只看该作者 5楼 发表于: 2013-08-08
回 3楼(sdyansong) 的帖子
在mainwindow里面接受ChildWindowEvent信号
需要这么1个条件,有这两个类:mainwindow和menu实例的指针,在任何地方,任何类里面都可以connect。

emit函数怎么才能给特定的槽发送信号啊?
emit 是发射信号的,发射信号的时候是不会知道,有几个槽connect在这个信号上。
给特定的槽发射信号,2个办法:
单独写一个专用信号。
给信号加个参数,槽里靠参数区分该是哪个槽动作。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线sdyansong

只看该作者 6楼 发表于: 2013-08-08
回 5楼(jdwx) 的帖子
哦,歇息您,我试试吧,如果您有时间能否告诉我怎么改上面的程序,我现在不知道怎么改。
离线sdyansong

只看该作者 7楼 发表于: 2013-08-08
回 6楼(sdyansong) 的帖子
谢谢您,非产感谢您
离线zheguzai

只看该作者 8楼 发表于: 2013-10-29
还是我来说吧

问题出在你下面这句上
connect(this,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));  

看了下你的代码很明显你的ChildWindowEvent()信号时定义在menu类当中的,但是你在写connect函数的时候,第一个参数写的却是this,你要清楚这里的this指的就是mainwindow类,请问你的mainwindow类中有ChildWindowEvent()信号吗?肯定是没有的,所以你如果想要在mainwindows中接受menu发送来的信号,就得在mainwindow类中定义一个menu的对象,然后在connect的时候第一个参数写成menu对象指针,就不会错了,举个例子给你看看


Menu  *mymenu =  new Menu();

connect(mymenu ,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));

这样就不会错了,你的mymenu是Menu对象,它才有ChildWindowEvent()信号,后面的this代表mainwindow类,它也有Button_clicked()槽,这样连接就没有错误了,才可以正确运行。。。


如果还不理解,好好看看信号和槽的关系,怎么把不同类的信号发送到另外一个类中,
其实就是一个类发送信号,另一个类去处理,但是在写connect的时候,前面两个参数代表发送的类,发送的对象要具有发送的信号,后面两个参数代表接收的类,接收的类也要有接收的slot函数


其实也可以再第三个类中接收第一个类传过来的信号,让第二个类去处理,这种复杂的也是可以实现的。

//此对象用于发送ChildWindowEvent()信号
Menu  *mymenu =  new Menu();

//此对象用于接收信号,并用SampleDoSomething()槽去处理
Samle *mysample = new Sample();

connect(mymenu ,SIGNAL(ChildWindowEvent()),mysample ,SLOT(SampleDoSomething()));




离线nxqzk

只看该作者 9楼 发表于: 2014-01-14
Q2648038977
离线枫界易城

只看该作者 10楼 发表于: 2014-05-01
学习了,,,,,,,,
离线xingfengshi

只看该作者 11楼 发表于: 2014-05-18

只看该作者 12楼 发表于: 2014-06-13
8楼正解
离线_jason

只看该作者 13楼 发表于: 2014-06-19
回 zheguzai 的帖子
zheguzai:还是我来说吧
问题出在你下面这句上
connect(this,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));  
....... (2013-10-29 19:26) 

正解,QT核心就是信号与槽,让问题的解决变的多样化
默默地努力,从未被超越

只看该作者 14楼 发表于: 2014-08-16
参考解决方案:
在mainWindow.cpp里包含 menu.h
在mainWindow的构造函数里添加:
Menu mu;
connect(mu,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked()));
mu->hide();

在MainWindow::butTon(QWidget *)函数里删除connect(this,SIGNAL(ChildWindowEvent()),this,SLOT(Button_clicked())) 这句。

只看该作者 15楼 发表于: 2014-08-16
mu->hide() 改成mu.hide()    打快了。。。
离线fengshutieto

只看该作者 16楼 发表于: 2014-12-08
快速回复
限100 字节
 
上一个 下一个