QT学习7:1个事物领导另一个

 LCDRange.h

#ifndef LCDRANGE_H_
#define LCDRANGE_H_

#include <QWidget.h>

class QSlider;

class LCDRange:public QWidget
{
	Q_OBJECT
public:
	LCDRange(QWidget* parent=NULL, const char *name=NULL);
	int value() const;

public slots:
	void setValue(int);
 
signals://信号只声明,不能定义.
	void valueChanged(int);
	
private:
	QSlider       *slider;


};


#endif//LCDRANGE_H_


LCDRange.cpp

#include "LCDRange.h"
#include <QSlider.h>
#include <QLCDNumber.h>
#include <QVBoxLayout>

LCDRange::LCDRange(QWidget* parent, const char *name)
:QWidget(parent, name)
{
	QLCDNumber *lcd = new QLCDNumber(2, this);
	slider = new QSlider(Qt::Orientation::Horizontal, this);
	slider->setRange(0, 99);
	slider->setValue(0);


	//别把display(int)写成Display(int)了,不然不会响应的,而且你就算写成display1,
	//编译器也不会报错,只是不响应
	//
	connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

	//信号-->类的信号-->
	connect(slider, SIGNAL(valueChanged(int)), SIGNAL(valueChanged(int)));

	QVBoxLayout *vlayout = new QVBoxLayout;
	vlayout->addWidget(lcd);
	vlayout->addWidget(slider);

	setLayout(vlayout);
}

int LCDRange::value() const
{
	return slider->value();
}

void LCDRange::setValue(int value)
{
	slider->setValue(value);
}


main

#include "qtlesson.h"
#include <QtGui/QApplication>
#include <QPushButton.h>
#include <QFont.h>
#include <QVBoxLayout>
#include <QGridLayout>
#include "LCDRange.h"

class MyWidget : public QWidget
{
public:
	MyWidget(QWidget *parent=NULL, const char *name=NULL);
};

MyWidget::MyWidget(QWidget* parent, const char *name)
{
	QPushButton *quit = new QPushButton("Quit", this);
	quit->setFont(QFont(("Times"), 18, QFont::Bold));

	connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    
	QVBoxLayout *vlayout = new QVBoxLayout;

	//QGridLayout,这里和列有关,比如(6,12),因为才12个,那就网格成一行了,
	QGridLayout *grid = new QGridLayout(6, 12);

	LCDRange *previous = 0;
	for (int r=0; r<3; r++)
	{
		for (int c=0; c<4; c++)
		{
			LCDRange *lr = new LCDRange(this);
			if (previous)
			{
				connect(lr, SIGNAL(valueChanged(int)), previous, SLOT(setValue(int)));
			}

			grid->addWidget(lr);
			previous = lr;
		}
	}

	vlayout->addWidget(quit);
	vlayout->addLayout(grid);
	
	setLayout(vlayout);
}


int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	MyWidget w;
	a.setMainWidget(&w);
	w.show();
	
	return a.exec();
}


1.QGridLayout,和列有关,比如(6,12),因为才12个,那就网格成一行了,

2.信号只声明,不能定义.一定义就提示错误

3.信号的调用可以通过emit valueChanged(xx)这样被其他调用

4.connect好像不做代码检查的,也就是无论SIGNAL()和 SLOT()中填的是不是已存在的函数,它都认为OK,编译通过

原文地址:https://www.cnblogs.com/hgy413/p/3693570.html