基本概念
- 信号和槽
QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );
在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(发送消息)和slots(接收消息)。所有窗口部件都是Qt对象。它们继承QWidget,而QWidget继承QObject。
这里quit的clicked()信号和a的quit()槽连接起来了,所以当这个按钮被按下的时候,这个程序就退出了。
学习资料
QT教程第三章
//#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_OBJECT
public:
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>