QMessageBox 详解:
通过QMessageBox提一个问题,这个是模态对话框。
制作一个询问是否保存的对话框:
信号与槽的基本用法:
newapaper.h
#ifndef NEWAPAPER_H
#define NEWAPAPER_H
#include <QObject>
class Newspaper : public QObject
{
Q_OBJECT
public:
Newspaper(const QString &name)
{
m_name = name;
}
void send() const
{
emit newPaper(m_name);
}
signals:
void newPaper(const QString &name) const;
private:
QString m_name;
};
#endif // NEWAPAPER_H
--------------------华丽的分割线------------------------
reader.h
#ifndef READER_H
#define READER_H
#include <QObject>
#include <QDebug>
class Reader : public QObject
{
Q_OBJECT
public:
Reader() {}
void receiveNewspaper(const QString &name) const
{
qDebug()<< "Receives Newspaper:" << name;
}
};
#endif // READER_H
--------------------华丽的分割线------------------------
#include <QApplication>
#include "newapaper.h"
#include "reader.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
Newspaper newspaper("Newspaper A");
Reader reader;
QObject::connect(&newspaper,&Newspaper::newPaper,&reader,&Reader::receiveNewspaper);
newspaper.send();
return app.exec();
}
如果有重载的信号函数比如:
void newPaper(const QString &name,const QDate &date);
我们的处理方式可以像是Qt4一样写SIANGAL和SLOT宏来连接链接信号函数和槽函数,
QObject::connect(&newspaper,SIGNAL(newPaper(QString,QDate)),&reader,SLOT(receiveNewspaper(QString,QDate)));
因为Qt4的信号槽连接是带参数的。因此,Qt能自己判断清楚究竟是哪一个信号对应了哪一个槽。
如果不是用Qt4的宏,我们可以这么解决:
使用一个函数指针来指明到底是哪一个信号:
void (Newspaper:: *newPaperNameDate)(const QString &,const QDate &) = &Newspaper::newPaper;
QObject::connect(&newspaper,newPaperNameDate,&reader,&Reader::receiveNewspaper);
这样我们使用函数指针newPaperNameDate声明了一个带有QString和QDate两个参数,返回值是void的函数,将该函数作为信号与Reader::receiveNewspaper()槽连接,这样就避免了重载带来的不明性。
或者这样写,只是声明了一个匿名的函数指针
再或者是下面的C++的方法:
static_cast用于数值类型之间或者void * 和别的 * 之间(转换)。
有什么问题加我QQ:839505138.