1)
signals:
void sigSub();
void sigSub(int, QString);
然后發送的時候可以發送多個信號。
emit sigSub(100, “lol”);
在寫connect函數的時候:
connect(&sb, &SubWidget::sigSub, this, &Widget::slotShowMe);
connect(&sb, &SubWidget::sigSub, this, &Widget::slotSubMessage);
這樣寫會報錯:槽函數和信號匹配不了。
因為在這里sigSub是函數名的地址,不知道參數有幾個。重載之后編譯器不知道去找哪一個函數了。
考慮函數指針,當定義函數指針時,就顯式地定義了有幾個參數。
void (SubWidget::*MySigSub)() = &SubWidget::sigSub; //自動找那個沒有參數的 注意函數指針屬於SubWidget類
void (SubWidget::*MySigSubPlus)(int, QString) = &SubWidget::sigSub;//能夠找到帶參數的那個函數地址
connect(&sb, MySigSub, this, &Widget::slotShowMe);
connect(&sb, MySigSubPlus, this, &Widget::slotSubMessage);
2)注意slotSubMessage函數的輸出要用QDebug類,qDebug() << a << ' '<< s;
如果打印出來的字符串是亂碼,查看qDebug的參數為const char*,可能是參數不匹配(貌似QT 5.11已經沒有這個問題了QAQ)。需要將QString轉換為char*。
QString類有一個函數:toUtf8();
這樣寫即可:
qDebug() << a << ' '<< s.toUtf8().data();
注意:
std::string ss;
ss.c_str();
ss.data();//可以轉化為char*
3)如果槽函數也重載了,還是需要定義一個函數指針。顯式地聲明槽函數的類型。注意別落下類名加作用域運算符。
//widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> #include "subwidget.h" QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); void slotOpenSubWindow(); void slotShowMe(); void slotSubMessage(int, QString); private: Ui::Widget *ui; QPushButton* b1;//顯示子窗口 SubWidget sb;//子窗口對象 }; #endif // WIDGET_H
//subwidget.h #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class SubWidget: public QWidget { Q_OBJECT public: explicit SubWidget(QWidget *parent = 0); signals: void sigSub(); void sigSub(int, QString); public slots: void myslot(); private: QPushButton* b1; }; #endif // SUBWIDGET_H
//widget.cpp #include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); b1 = new QPushButton("點我點我", this); b1->resize(100, 50); b1->move(300, 300); connect(b1, &QPushButton::clicked, this, &Widget::slotOpenSubWindow); void (SubWidget::*MySigSub)() = &SubWidget::sigSub; //自動找那個沒有參數的 注意函數指針屬於SubWidget類 void (SubWidget::*MySigSubPlus)(int, QString) = &SubWidget::sigSub;//能夠找到帶參數的那個函數地址 connect(&sb, MySigSub, this, &Widget::slotShowMe); connect(&sb, MySigSubPlus, this, &Widget::slotSubMessage); } Widget::~Widget() { delete ui; } void Widget::slotOpenSubWindow() { hide(); sb.show(); } void Widget::slotShowMe() { show(); sb.hide(); } void Widget::slotSubMessage(int a, QString s) { qDebug() << a << ' '<< s.toUtf8().data(); std::string ss; ss.c_str(); ss.data();//可以轉化為char* }
//subwidget.cpp #include "subwidget.h" SubWidget::SubWidget(QWidget *parent): QWidget(parent) { b1 = new QPushButton("我草泥馬的線段樹", this); b1 -> resize(200, 100); b1->move(150, 150); setWindowTitle("我叫線段樹"); resize(400, 600); connect(b1, &QPushButton::clicked, this, &SubWidget::myslot); } void SubWidget::myslot() { //發送信號 emit sigSub(); emit sigSub(100, "傻逼樹狀數組"); }
//main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }