基本概念信號和槽
QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );
在兩個Qt對象(直接或間接繼承QObject對象的對象)中建立了一種單向的連接。每一個Qt對象都有signals(發送消息)和slots(接收消息)。所有窗口部件都是Qt對象。它們繼承QWidget,而QWidget繼承QObject。
這裡quit的clicked()信號和a的quit()槽連接起來了,所以當這個按鈕被按下的時候,這個程序就退出了。
//#include "ex_ch1.h"//#include <QtWidgets/QApplication>#include <qpushbutton.h>#include <qfont.h>#include <qboxlayout.h>#include<qapplication.h>int main(int argc, char *argv[]){ QApplication a(argc, argv); //ex_ch1 w; //w.show(); QWidget window; window.resize(200,120); QVBoxLayout layout; QPushButton quit("Quit",&window); quit.setFont(QFont("Times",18,QFont::Bold)); QObject::connect(&quit,SIGNAL(clicked()),&a,SLOT(quit())); layout.addWidget(&quit); window.setLayout(&layout); window.show(); return a.exec();}
效果:Qt 第四章使用窗口插件#include<qapplication.h>#include<qpushbutton.h>#include<qfont.h>class MyWidget: public QWidget{public: MyWidget(QWidget *parent=0, const char *name=0);};MyWidget::MyWidget(QWidget *parent, const char *name){ setMinimumSize(200, 120); setMaximumSize(400, 1200); QPushButton *quit = new QPushButton("Quit", this); //QPushButton *quit = new QPushButton(QIcon("Quit"), this, "quit"); quit->setGeometry(62, 40, 75, 30); quit->setFont(QFont("Times", 18, QFont::Bold)); QPushButton *ui = new QPushButton("UI", this); ui->setGeometry(100, 100, 100, 100); ui->setFont(QFont("Times", 20, QFont::Bold)); connect(quit, SIGNAL(clicked()), quit, SLOT(quit()));}int main(int argc, char *argv[]){ QApplication a(argc, argv); //ex_ch4 w; //w.show(); MyWidget w; w.setGeometry(100, 100, 200, 120); w.show(); return a.exec();}
展示第五章:組裝積木#include <qapplication.h>#include <qpushbutton.h>#include <qslider.h>#include <qlcdnumber.h>#include <qfont.h>#include <QVBoxLayout>int main( int argc, char **argv ){ QApplication a( argc, argv ); QWidget window; QPushButton *quit = new QPushButton( "Quit", &window ); quit->setFont( QFont( "Times", 18, QFont::Bold ) ); QObject::connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); QLCDNumber *lcd = new QLCDNumber( 2, &window ); QSlider * slider = new QSlider( Qt::Horizontal, &window ); slider->setRange( 0, 99 ); slider->setValue( 0 ); QObject::connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); QVBoxLayout layout; layout.addWidget(quit); layout.addWidget(lcd); layout.addWidget(slider); window.setLayout(&layout); window.show(); return a.exec();}
第六章 組裝豐富的積木#include<qapplication.h>#include<qpushbutton.h>#include<qslider.h>#include<qlcdnumber.h>#include<qfont.h>#include<qboxlayout.h>#include<qgridlayout.h>class LCDRange:public QWidget{public: LCDRange(QWidget *parent=0, Qt::WindowFlags f=0);};LCDRange::LCDRange(QWidget *parent, Qt::WindowFlags f):QWidget(parent, f){ QLCDNumber *lcd = new QLCDNumber(2); QSlider *slider = new QSlider(Qt::Horizontal); slider->setRange(0, 99); slider->setValue(0); connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); QVBoxLayout* layout = new QVBoxLayout; layout->addWidget(lcd); layout->addWidget(slider); setLayout(layout);}class MyWidget:public QWidget{public: MyWidget(QWidget *parent=0, Qt::WindowFlags f=0);};MyWidget::MyWidget(QWidget *parent, Qt::WindowFlags f):QWidget(parent, f){ QVBoxLayout *layout = new QVBoxLayout; QPushButton *quit = new QPushButton("Quit"); quit->setFont(QFont("Times", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); QGridLayout *grid = new QGridLayout; for (int r = 0; r < 4; r++) { for (int c = 0; c < 5; c++) { grid->addWidget(new LCDRange(this), r, c); } } layout->addWidget(quit); layout->addLayout(grid); setLayout(layout);}int main(int argc, char **argv){ QApplication a(argc, argv); MyWidget w; w.resize(600, 100); w.show(); return a.exec();}
展示第七章:一個事物領導另一個main.cpp
//#include "ex_ch6.h"//#include <QtWidgets/QApplication>#include<qapplication.h>#include<qpushbutton.h>#include<qslider.h>#include<qlcdnumber.h>#include<qfont.h>#include<qboxlayout.h>#include<qgridlayout.h>#include<lcdrange.h>class MyWidget:public QWidget{public: MyWidget(QWidget *parent=0, Qt::WindowFlags f=0);};MyWidget::MyWidget(QWidget *parent, Qt::WindowFlags f):QWidget(parent, f){ QVBoxLayout *layout = new QVBoxLayout; QPushButton *quit = new QPushButton("Quit"); quit->setFont(QFont("Times", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); QGridLayout *grid = new QGridLayout; LCDRange *previous = 0; for (int r = 0; r < 4; r++) { for (int c = 0; c < 5; c++) { LCDRange *lr = new LCDRange(this); grid->addWidget(lr, r, c); if (previous) { connect(lr, SIGNAL(valueChanged(int)), previous, SLOT(setValue(int))); } previous = lr; } } layout->addWidget(quit); layout->addLayout(grid); setLayout(layout);}int main(int argc, char **argv){ QApplication a(argc, argv); MyWidget w; w.resize(600, 100); w.show(); return a.exec();}
lcdrange.h
#ifndef LCDRANGE_H#define LCDRANGE_H#include<qboxlayout.h>#include<qwidget.h>#include<qslider.h>#include<qlcdnumber.h>class QSlider;class LCDRange:public QWidget{ Q_OBJECTpublic: LCDRange(QWidget *parent=0, Qt::WindowFlags=0); int value() const;public slots: void setValue(int);signals: void valueChanged(int);private: QSlider *slider;};#endif
lcdrange.cpp
#include "lcdrange.h"LCDRange::LCDRange(QWidget *parent, Qt::WindowFlags f):QWidget(parent, f){ QLCDNumber *lcd = new QLCDNumber(2); QSlider *slider = new QSlider(Qt::Horizontal); slider->setRange(0, 99); slider->setValue(0); connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(lcd); layout->addWidget(slider); setLayout(layout);}int LCDRange::value() const{ return slider->value();}void LCDRange::setValue(int value){ slider->setValue(value);}
效果第八章:準備戰鬥幾個需要注意的問題在qt5.x中#include <qvbox.h>變成了#include <qboxlayout.h>