<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Qt5 中的事件和信號 > 原文: [http://zetcode.com/gui/qt5/eventsandsignals/](http://zetcode.com/gui/qt5/eventsandsignals/) 在 Qt5 C++ 編程教程的這一部分中,我們討論事件和信號。 事件是任何 GUI 程序中的重要組成部分。 所有 GUI 應用都是事件驅動的。 應用會對在其生命周期內生成的不同事件類型做出反應。 事件主要由應用的用戶生成。 但是它們也可以通過其他方式生成,例如互聯網連接,窗口管理器或計時器。 在事件模型中,有三個參與者: * 事件來源 * 事件對象 * 事件目標 事件源是狀態更改的對象。 它生成事件。事件對象(事件)將狀態更改封裝在事件源中。事件目標是要通知的對象。 事件源對象將處理事件的任務委托給事件目標。 當我們調用應用的`exec()`方法時,應用進入主循環。 主循環獲取事件并將其發送到對象。 Qt 具有獨特的信號和槽機制。 該信號和槽機制是 C++ 編程語言的擴展。 信號和槽用于對象之間的通信。 當發生特定事件時,會發出信號。槽是正常的 C++ 方法; 發出與其連接的信號時調用它。 ## 點擊 第一個示例顯示了一個非常簡單的事件處理示例。 我們有一個按鈕。 通過單擊按鈕,我們終止該應用。 `click.h` ```cpp #pragma once #include <QWidget> class Click : public QWidget { public: Click(QWidget *parent = 0); }; ``` 這是頭文件。 `click.cpp` ```cpp #include <QPushButton> #include <QApplication> #include <QHBoxLayout> #include "click.h" Click::Click(QWidget *parent) : QWidget(parent) { QHBoxLayout *hbox = new QHBoxLayout(this); hbox->setSpacing(5); QPushButton *quitBtn = new QPushButton("Quit", this); hbox->addWidget(quitBtn, 0, Qt::AlignLeft | Qt::AlignTop); connect(quitBtn, &QPushButton::clicked, qApp, &QApplication::quit); } ``` 我們在窗口上顯示一個`QPushButton`。 ```cpp connect(quitBtn, &QPushButton::clicked, qApp, &QApplication::quit); ``` `connect()`方法將信號連接到槽。 當我們單擊退出按鈕時,會生成`clicked`信號。 `qApp`是指向應用對象的全局指針。 它在`<QApplication>`頭文件中定義。 發出點擊信號時,將調用`quit()`方法。 `main.cpp` ```cpp #include <QApplication> #include "click.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Click window; window.resize(250, 150); window.setWindowTitle("Click"); window.show(); return app.exec(); } ``` 這是主文件。 ![Click](https://img.kancloud.cn/61/7b/617bb65b4bf06e986c8cb5896356250c_252x176.jpg) 圖:點擊 ## 按鍵 在以下示例中,我們對按鍵進行反應。 `keypress.h` ```cpp #pragma once #include <QWidget> class KeyPress : public QWidget { public: KeyPress(QWidget *parent = 0); protected: void keyPressEvent(QKeyEvent * e); }; ``` 這是`keypress.h`頭文件。 `keypress.cpp` ```cpp #include <QApplication> #include <QKeyEvent> #include "keypress.h" KeyPress::KeyPress(QWidget *parent) : QWidget(parent) { } void KeyPress::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape) { qApp->quit(); } } ``` 如果我們按 `Escape` 鍵,則應用終止。 ```cpp void KeyPress::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Escape) { qApp->quit(); } } ``` 在 Qt5 中使用事件的一種方法是重新實現事件處理器。 `QKeyEvent`是一個事件對象,其中包含有關發生的情況的信息。 在我們的例子中,我們使用事件對象來確定實際按下了哪個鍵。 `main.cpp` ```cpp #include <QApplication> #include "keypress.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); KeyPress window; window.resize(250, 150); window.setWindowTitle("Key press"); window.show(); return app.exec(); } ``` 這是主文件。 ## `QMoveEvent` `QMoveEvent`類包含移動事件的事件參數。 移動事件將發送到已移動的窗口小部件。 `move.h` ```cpp #pragma once #include <QMainWindow> class Move : public QWidget { Q_OBJECT public: Move(QWidget *parent = 0); protected: void moveEvent(QMoveEvent *e); }; ``` 這是`move.h`頭文件。 `move.cpp` ```cpp #include <QMoveEvent> #include "move.h" Move::Move(QWidget *parent) : QWidget(parent) { } void Move::moveEvent(QMoveEvent *e) { int x = e->pos().x(); int y = e->pos().y(); QString text = QString::number(x) + "," + QString::number(y); setWindowTitle(text); } ``` 在我們的代碼編程示例中,我們對移動事件做出反應。 我們確定窗口客戶區左上角的當前 x,y 坐標,并將這些值設置為窗口標題。 ```cpp int x = e->pos().x(); int y = e->pos().y(); ``` 我們使用`QMoveEvent`對象來確定`x`和`y`值。 ```cpp QString text = QString::number(x) + "," + QString::number(y); ``` 我們將整數值轉換為字符串。 ```cpp setWindowTitle(text); ``` `setWindowTitle()`方法將文本設置為窗口的標題。 `main.cpp` ```cpp #include <QApplication> #include "move.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Move window; window.resize(250, 150); window.setWindowTitle("Move"); window.show(); return app.exec(); } ``` 這是主文件。 ![QMoveEvent](https://img.kancloud.cn/3d/2b/3d2b619f6176a0b649eb72732783c3e5_252x176.jpg) 圖:`QMoveEvent` ## 斷開信號 可以從槽斷開信號。 下一個示例顯示了我們如何完成此任務。 `disconnect.h` ```cpp #pragma once #include <QWidget> #include <QPushButton> class Disconnect : public QWidget { Q_OBJECT public: Disconnect(QWidget *parent = 0); private slots: void onClick(); void onCheck(int); private: QPushButton *clickBtn; }; ``` 在頭文件中,我們聲明了兩個槽。 `slots`不是 C++ 關鍵字,它是 Qt5 擴展名。 在代碼編譯之前,這些擴展由預處理器處理。 當我們在類中使用信號和時隙時,必須在類定義的開頭提供`Q_OBJECT`宏。 否則,預處理器會抱怨。 `disconnect.cpp` ```cpp #include <QTextStream> #include <QCheckBox> #include <QHBoxLayout> #include "disconnect.h" Disconnect::Disconnect(QWidget *parent) : QWidget(parent) { QHBoxLayout *hbox = new QHBoxLayout(this); hbox->setSpacing(5); clickBtn = new QPushButton("Click", this); hbox->addWidget(clickBtn, 0, Qt::AlignLeft | Qt::AlignTop); QCheckBox *cb = new QCheckBox("Connect", this); cb->setCheckState(Qt::Checked); hbox->addWidget(cb, 0, Qt::AlignLeft | Qt::AlignTop); connect(clickBtn, &QPushButton::clicked, this, &Disconnect::onClick); connect(cb, &QCheckBox::stateChanged, this, &Disconnect::onCheck); } void Disconnect::onClick() { QTextStream out(stdout); out << "Button clicked" << endl; } void Disconnect::onCheck(int state) { if (state == Qt::Checked) { connect(clickBtn, &QPushButton::clicked, this, &Disconnect::onClick); } else { disconnect(clickBtn, &QPushButton::clicked, this, &Disconnect::onClick); } } ``` 在我們的示例中,我們有一個按鈕和一個復選框。 復選框用于將槽與單擊的信號按鈕斷開連接。 此示例必須從命令行執行。 ```cpp connect(clickBtn, &QPushButton::clicked, this, &Disconnect::onClick); connect(cb, &QCheckBox::stateChanged, this, &Disconnect::onCheck); ``` 在這里,我們將信號連接到用戶定義的槽。 ```cpp void Disconnect::onClick() { QTextStream out(stdout); out << "Button clicked" << endl; } ``` 如果單擊“單擊”按鈕,則將`"Button clicked"`文本發送到終端窗口。 ```cpp void Disconnect::onCheck(int state) { if (state == Qt::Checked) { connect(clickBtn, &QPushButton::clicked, this, &Disconnect::onClick); } else { disconnect(clickBtn, &QPushButton::clicked, this, &Disconnect::onClick); } } ``` 在`onCheck()`槽內,我們根據單擊狀態將`onClick()`槽與單擊按鈕連接或斷開。 `main.cpp` ```cpp #include <QApplication> #include "disconnect.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Disconnect window; window.resize(250, 150); window.setWindowTitle("Disconnect"); window.show(); return app.exec(); } ``` 這是主文件。 ## 計時器 計時器用于執行單發或重復性任務。 一個使用計時器的好例子是時鐘。 每秒,我們必須更新顯示當前時間的標簽。 `timer.h` ```cpp #pragma once #include <QWidget> #include <QLabel> class Timer : public QWidget { public: Timer(QWidget *parent = 0); protected: void timerEvent(QTimerEvent *e); private: QLabel *label; }; ``` 這是頭文件。 `timer.cpp` ```cpp #include "timer.h" #include <QHBoxLayout> #include <QTime> Timer::Timer(QWidget *parent) : QWidget(parent) { QHBoxLayout *hbox = new QHBoxLayout(this); hbox->setSpacing(5); label = new QLabel("", this); hbox->addWidget(label, 0, Qt::AlignLeft | Qt::AlignTop); QTime qtime = QTime::currentTime(); QString stime = qtime.toString(); label->setText(stime); startTimer(1000); } void Timer::timerEvent(QTimerEvent *e) { Q_UNUSED(e); QTime qtime = QTime::currentTime(); QString stime = qtime.toString(); label->setText(stime); } ``` 在我們的示例中,我們在窗口上顯示當前本地時間。 ```cpp label = new QLabel("", this); ``` 為了顯示時間,我們使用標簽小部件。 ```cpp QTime qtime = QTime::currentTime(); QString stime = qtime.toString(); label->setText(stime); ``` 在這里,我們確定當前的本地時間。 我們將其設置為標簽小部件。 ```cpp startTimer(1000); ``` 我們啟動計時器。 每 1000ms 會生成一個計時器事件。 ```cpp void Timer::timerEvent(QTimerEvent *e) { Q_UNUSED(e); QTime qtime = QTime::currentTime(); QString stime = qtime.toString(); label->setText(stime); } ``` 要處理計時器事件,我們必須重新實現`timerEvent()`方法。 `main.cpp` ```cpp #include <QApplication> #include "timer.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Timer window; window.resize(250, 150); window.setWindowTitle("Timer"); window.show(); return app.exec(); } ``` 這是主文件。 ![Timer](https://img.kancloud.cn/1f/cd/1fcd35082fd39f8583532e7ebc997fcf_252x176.jpg) 圖:計時器 本章專門介紹 Qt5 中的事件和信號。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看