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.