其实关于c++还有一个STL的内容,由于比较繁多,我后面来更,今天我们说界面开发,
当然学东西我们不能只学怎么用,直接去学函数和参数,我们应该了解本质。
现在我们开始说今天的内容。
一.图形显示原理
1.像素点,分辨率,RGB,透明度,显存...
二.Linux上如何编程显示器
linux帧缓存(frambuffer)
编程:其实就是操作/dev/fb*文件
举个例子,如何画点,横线,竖线
#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int ret ; struct fb_var_screeninfo fbi_var;//定义可变参数 struct fb_fix_screeninfo fbi_fix;//定义固定参数 struct fb_cmap cmap; //打开屏幕设备 int fd = open("/dev/fb0",O_RDWR); if(fd < 0){ perror("open"); close(fd); } //得到虚拟屏幕参数 ret = ioctl(fd,FBIOGET_VSCREENINFO,&fbi_var); if(ret < 0){ perror("ioctl"); return NULL; } 3. QT是什么 一堆可用于图形界面开发的C++类库 4. QT环境的安装(QT IDE) 1. QT类库 2. 编程编译环境 printf("fbi.var.xres:%u ,fbi.var.yres:%u ,var.bpp:%dn",fbi_var.xres ,fbi_var.yres,fbi_var.bits_per_pixel); printf("fbi.var.xoffset:%u ,fbi.var.yoffset:%un",fbi_var.xoffset ,fbi_var.yoffset); //得到实际屏幕参数 ret = ioctl(fd,FBIOGET_FSCREENINFO,&fbi_fix); if(ret < 0){ perror("ioctl"); return NULL; } printf("fbi.fix.smem_start:%lu ,fbi.fix.smem_len:%un",fbi_fix.smem_start ,fbi_fix.smem_len); printf("line_length: %un",fbi_fix.line_length); //获取显存起始地址 int *addr = mmap(NULL,fbi_fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(addr == NULL){ perror("mmap"); ret = munmap(addr,fbi_fix.smem_len); return NULL; } //画竖线 int i = 100; while(i--) { *addr = 0xff00ff00; addr += 2048; //(得到下一行像素点的显存地址) } close(fd); return 0; }
效果图
这个图不是上面的代码,却是改来的,为了看着更清晰
那说到这里,我们怎么去实现我们想要的图形呢?
大家可以看出一个一个去操控点,线,面是很麻烦的,这里要感谢外国的两个大学生,他们用一个假期,用c++封装了大量的库供后面人使用,所以 现在我们来进入今天的内容 QT。
三.QT是什么?
一堆可用于图形开发的c++库
四.QT的安装环境
1. QT类库
2. 编程编译环境
3. 创建工程
五.必要的补充
1. QPushButton 和 QLineEdit
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//2. 将控件真正的new出来
//将按钮new出来
bt = new QPushButton;
bt->setText("登录");
//bt->show();
bt->setParent(this);
le = new QLineEdit;
le->setParent(this);
//3. 排版
le->setGeometry(10, 10, 200, 30);
bt->setGeometry(100, 100, 100, 50);
//4. 前后台功能挂接(信号与槽)
//connect(bt, SIGNAL(clicked(bool)), this, SLOT(close()));
connect(bt, SIGNAL(clicked(bool)), this, SLOT(le_to_Uper()));
}
Widget::~Widget()
{
}
#ifndef WIDGET_H #define WIDGET_H #include#include #include class Widget : public QWidget { Q_OBJECT //申明槽函数: 此函数未来可以直接调用 也可以 用信号绑定调用 public slots: void le_to_Uper() { QString str = le->text(); //提取文字 str = str.toUpper(); //文字小写变大写 le->setText(str); //显示文字 } public: Widget(QWidget *parent = 0); ~Widget(); private: //1. 申明自己界面上想要的“子部件” //希望界面上有个“按钮” QPushButton *bt; //希望界面上有一个 行输入框 QLineEdit *le; }; #endif // WIDGET_H
#include "widget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
2.布局
#include "widget.h" #includeWidget::Widget(QWidget *parent) : QWidget(parent) { bt = new QPushButton; bt->setParent(this); //设置父控件:回收和显示和父一起了 bt->setText("登录"); //设置按钮上的文字 QString str = bt->text(); //提取按钮上的文字 qDebug()< setGeometry(100, 100, 100, 50); //强制设置 控/部件 位置 bt->setFixedSize(10, 10);//设置固定大小 bt->setMinimumSize(10, 10);//设置最小大小 bt->setMaximumSize(10, 10);//设置最大大小 le = new QLineEdit; le->setParent(this); le->setText("xxxxxx"); str = le->text(); //提取按钮上的文字 qDebug()< setGeometry(100, 200, 100, 50); //强制设置 控/部件 位置 le->setEchoMode(QLineEdit::Password); //设置回显方式 le->setAlignment(Qt::AlignRight); //设置对其方式 le->setFixedSize(10, 10);//设置固定大小 le->setMinimumSize(10, 10);//设置最小大小 le->setMaximumSize(10, 10);//设置最大大小 } Widget::~Widget() { }
#ifndef WIDGET_H #define WIDGET_H #include#include #include class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); //申明需要按钮 QPushButton *bt; //申明需要行编辑框(输入框) QLineEdit *le; }; #endif // WIDGET_H
#include "widget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
3.QString
#include "widget.h" #includeWidget::Widget(QWidget *parent) : QWidget(parent) { bt = new QPushButton("1"); bt1 = new QPushButton("2"); le = new QLineEdit; QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(le); vbox->addWidget(bt); vbox->addWidget(bt1); setLayout(vbox); connect(bt, SIGNAL(clicked(bool)), this, SLOT(xxx())); connect(bt1, SIGNAL(clicked(bool)), this, SLOT(xxx())); } Widget::~Widget() { }
#ifndef WIDGET_H #define WIDGET_H #include#include #include #include class Widget : public QWidget { Q_OBJECT public slots: void xxx() { //0.提取按钮(可能来自于任意的按钮) QPushButton *xbt = static_cast ( sender() ); //1.提取按钮的文字 QString str = xbt->text(); //2.追加显示在行编辑框 //a.提取原来的文字 QString str1 = le->text(); //b.拼接新文字 str1.append(str); //c.重新设置回去 le->setText(str1); int a = str1.toInt(); //字符串转整型数 qDebug()<
#include "widget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
4.打印调试
#include "widget.h" #includeWidget::Widget(QWidget *parent) : QWidget(parent) { //构造需要的控件 bt = new QPushButton("1"); bt1 = new QPushButton("2"); le = new QLineEdit; le->setAlignment(Qt::AlignRight); #if 0 //垂直布局 QVBoxLayout *vbox = new QVBoxLayout; //构造一个布局管理器 vbox->addWidget(le); //将需要布局的控件加入布局管理器 vbox->addWidget(bt); this->setLayout(vbox); //将布局管理器贴在当前界面 #endif #if 0 //水平布局 QHBoxLayout *vbox = new QHBoxLayout; //构造一个布局管理器 vbox->addWidget(le); //将需要布局的控件加入布局管理器 vbox->addWidget(bt); this->setLayout(vbox); //将布局管理器贴在当前界面 #endif #if 0 //网格布局 QGridLayout *vbox = new QGridLayout; //构造一个布局管理器 vbox->addWidget(le, 0, 0, 1, 2); //将需要布局的控件加入布局管理器 vbox->addWidget(bt, 1, 1); this->setLayout(vbox); //将布局管理器贴在当前界面 #endif //混合布局 QHBoxLayout *hbox = new QHBoxLayout; hbox->addWidget(bt); hbox->addWidget(bt1); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(le); vbox->addLayout(hbox); this->setLayout(vbox); } Widget::~Widget() { }
#ifndef WIDGET_H #define WIDGET_H #include#include #include class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); QPushButton *bt, *bt1; QLineEdit *le; }; #endif // WIDGET_H
#include "widget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }



