まずは、メインウィンドウを持ったアプリケーションのスケルトン(骨組み)を作成し、ビルド・実行してみる。
今回は Qt のシグナル・スロットの使用方法をC++コードレベルで理解するために、QtDesiner を使用しない
→ Qt アプリケーションのスケルトンが作成される。
メインウィンドウの paintEvent() をオーバライドし、中央に "hello, world" を表示してみる。
class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void paintEvent(QPaintEvent *event); };
#include <QtGui> #include "mainwindow.h" ..... void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(Qt::blue); painter.setFont(QFont("Arial", 20)); painter.drawText(rect(), Qt::AlignCenter, "Hello, world."); }
class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void paintEvent(QPaintEvent *event); public slots: void setMessage(const QString &); private: QString m_message; };
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_message = "hello, world."; } void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(Qt::blue); painter.setFont(QFont("Arial", 20)); painter.drawText(rect(), Qt::AlignCenter, m_message); } void MainWindow::setMessage(const QString &mess) { if( mess != m_message ) { m_message = mess; repaint(); } }
class MainWindow : public QMainWindow { ..... private: QString m_message; class QLineEdit *m_lineEdit; };
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_message = "hello, world."; m_lineEdit = new QLineEdit; statusBar()->addWidget(m_lineEdit); connect(m_lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(setMessage(const QString &))); }
ステータスバーに "quit" と入力し Enter を押すと、プログラムを終了するようにしてみる。
class MainWindow : public QMainWindow { ..... public slots: void setMessage(const QString &); void onReturnPressed(); signals: void quit(); ..... };
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { ..... connect(m_lineEdit, SIGNAL(returnPressed()), this, SLOT(onReturnPressed())); } void MainWindow::onReturnPressed() { if( m_message == "quit" ) emit quit(); }
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); QObject::connect(&w, SIGNAL(quit()), &a, SLOT(quit())); return a.exec(); }