• 5333阅读
  • 3回复

[提问]关于抽象类与继承类信号的问题 [复制链接]

上一主题 下一主题
离线bluesealycn
 
只看楼主 倒序阅读 楼主  发表于: 2011-07-19
在抽象类中有纯虚函数,没有定义信号(我尝试定义了信号,好像也没用),在继承类中除实现了纯虚函数以外,还定义了信号以及一些成员变量。客户程序与抽象类关联,创建的继承类,现在的问题是继承类的信号怎么连接到槽函数?
抽象类:
class abstractA{
...
virtual abc() =0;
...
}

继承类:
class b:abstractA{
....
        abc();
...
signals:
        a(int x)
....
}

客户程序:
class c{
....
abstractA  *absa = new b();
connect(absa,SIGNAL(a(int),this,.....));    //---------------------报错,abstractA里加了信号也报错
...
}

问题:信号怎么继承?抽象类信号来自继承类,怎么连接到槽函数?请高手帮帮忙!
离线dbzhang800

只看该作者 1楼 发表于: 2011-07-19
不妨贴出你完整的测试例子(如果很长,在保证完整的情况下,不妨先精简到50行以内)
离线bluesealycn
只看该作者 2楼 发表于: 2011-07-19
做了一小段测试程序,完全可以代表我项目中遇到的问题,下面的代码编译会出问题,这正是我想解决的问题,如果不用抽象类将例子中带“--”的行注释掉,将带“***”的行去掉注释,程序就可以正常运行。希望得到高手的指点。
抽象类:
#ifndef ABSTRACTA_H
#define ABSTRACTA_H
class AbstractA
{
public:
    AbstractA();
    virtual void Add(int a,int b)=0;
};
#endif // ABSTRACTA_H

#include "abstracta.h"
AbstractA::AbstractA(){}
继承类:
#ifndef SUBCLASSB_H
#define SUBCLASSB_H
#include <QtGui/QDialog>
#include "abstracta.h"
class SubclassB:public QDialog,public AbstractA
{
    Q_OBJECT
public:
    SubclassB();
    virtual void Add(int a,int b);
signals:
    void result(int z);
private:
    int x;
};
#endif // SUBCLASSB_H

#include "subclassb.h"
SubclassB::SubclassB(){}
void SubclassB::Add(int a,int b)
{
    x = a+b;
    emit result(x);
}

客户程序:
#ifndef MYTEST_H
#define MYTEST_H
#include <QtGui>
#include "abstracta.h"
#include "subclassb.h"
class MyTest : public QDialog
{
    Q_OBJECT
public:
    MyTest(QWidget *parent = 0);
    ~MyTest();

private slots:
    void ShowResult(int z);
    void on_button_clicked();

private:
    AbstractA *a;           //---
    //SubclassB *sub;        ***
    QPushButton *button;
};
#endif // MYTEST_H

#include "mytest.h"
MyTest::MyTest(QWidget *parent): QDialog(parent)
{
    button = new QPushButton(this);
    button->setText("push me");
    connect(button,SIGNAL(clicked()),this,SLOT(on_button_clicked()));
}
MyTest::~MyTest(){}
void MyTest::ShowResult(int z)
{
    button->setText(QString::number(z,10));
}
void MyTest::on_button_clicked()
{
    a = new SubclassB();                  //---
    connect(a,SIGNAL(result(int)),this,SLOT(ShowResult(int)));//---
    a->Add(10,20);                        //---
    //sub = new SubclassB();                ***
    //connect(sub,SIGNAL(result(int)),this,SLOT(ShowResult(int)));***
    //sub->Add(10,20);                      ***
}

main函数:
#include <QtGui/QApplication>
#include "mytest.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyTest w;
    w.show();
    return a.exec();
}

mytest.pro:
QT       += core gui
TARGET = mytest
TEMPLATE = app
SOURCES += main.cpp\
        mytest.cpp \
    abstracta.cpp \
    subclassb.cpp
HEADERS  += mytest.h \
    abstracta.h \
    subclassb.h
离线bluesealycn
只看该作者 3楼 发表于: 2011-07-19
不好意思,刚才没有将*.h与*.cpp文件分开,烦请大家注意!
快速回复
限100 字节
 
上一个 下一个