目录
一、QT 、 GUI开发
c++/QT(开源) (java/android)/GUI/图形用户接口
1、图形显示原理
像素点、分辨率、RGB、透明度、显存
2、linux上如何编程显示器
linux帧缓存(frambuffer)编程 映射显示存储空间:mmap() 显示器文件: /dev/fb0*
3、QT是什么
一堆可用于图形界面开发的c++类库
4、QT环境的安装
1、库 2、编译环境
5、qt快捷键
1、ctrl + o : 打开文件或项目 2、ctrl + n :创建文件或项目 3、ctrl + a :全选 4、ctrl + i :自动对齐(先全选) 5、ctrl + s :保存 6、ctrl + sift +s :保存所有文件 7、ctrl + w :关闭窗口 8、CTRL + l : 跳转行 9、ctrl + z : 撤销 10、shfit + f2 : 切换函数声明与定义 11、ctrl + f:查找
6、QT程序开发流程
1、申请必要部件 2、将部件构造出来 3、必要的布局 4、前后台关联 5、美化
二、常见控件
1、按钮类
1、qpushbutton 普通按钮 2、qtoolbutton 工具按钮(一般用于图形显示) 3、qradiobutton 单选按钮(多个按钮时,只有一个被选择) 4、qcheckbox 复选框(多个按钮,可以同时选) 5、qcommandlinkbutoon 命令连接按钮g setGeometry(100, 100, 100, 50);
2、布局类
#include "widget.h" #include <QVBoxLayout> Widget::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() {}
3、输出类
1、 qlabel:标签,(文本、图片、动画) qlabel* le = new qlabl; le->setpixmap(qpixmap("falename")); 2、 qtextbrowser(文本浏览器),支持html文件 3、QCalendarWidget 日历窗口 4、QLCDNumber 七段数码管 5、QProgressBar 进度条 6、qtexttospech 在工程文件里加上代码: QT += texttospeech QTextToSpeech *m_speech=new QTextToSpeech; //异步朗读文字 m_speech->say("Hello!,老吕,发工资啦"); QTextToSpeech *speech = new QTextToSpeech(); speech->say(msg);//播报msg speech->stop();//停止当前的播报 speech->pause();//暂停当前的播报 speech->resume();//重新播报当前内容 enum State { Ready,//空闲 Speaking,//播报中 Paused,//暂停 BackendError//错误 }; #include "widget.h" #include <QVBoxLayout> #include <QMovie> #include <QTimer> Widget::Widget(QWidget *parent) : QWidget(parent) { /*标签*/ lb_text = new QLabel("标签测试"); lb_text->setAlignment(Qt::AlignCenter); lb_pix = new QLabel("我是图片"); lb_pix->setMinimumSize(10, 10); lb_pix->setScaledContents(true); //自动缩放显示 lb_pix->setPixmap(QPixmap("C:\\Users\\ThinkPad T490\\Desktop\\220501\\1.bmp")); lb_gif = new QLabel("我是动画"); QMovie *m = new QMovie("C:\\Users\\ThinkPad T490\\Desktop\\220501\\1.gif"); lb_gif->setMovie(m); m->start(); /*文本浏览器(html)*/ tbrowser = new QTextBrowser; tbrowser->setText("<!DOCTYPE html>\ <html>\ <head>\ <meta charset=\"utf-8\">\ <title>runoob.com</title>\ </head>\ <body>\ <h1 >AAAAAAAA</h1>\ <p style=\"background-color:rgb(255,0,0)\">BBBBBBBBB</p>\ </body>\ </html>"); /*日历窗口*/ caw = new QCalendarWidget; /*七段数码管*/ lcd = new QLCDNumber; lcd->setMinimumHeight(50); lcd->display(250); //显示数字 /*进度条*/ pbr = new QProgressBar; pbr->setValue(60); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(pbr); vbox->addWidget(lcd); vbox->addWidget(caw); vbox->addWidget(tbrowser); vbox->addWidget(lb_text); vbox->addWidget(lb_pix); vbox->addWidget(lb_gif); setLayout(vbox); connect(caw, SIGNAL(clicked(QDate)), this, SLOT(showDate(QDate))); QTimer *t = new QTimer; connect(t, SIGNAL(timeout()), this, SLOT(update_value())); t->start(100); } void Widget::update_value(void) { static int data = 0; lcd->display(data); pbr->setValue(data); data++; if(data == 100) data = 0; } void Widget::showDate(QDate d) { lb_text->setText(d.toString()); } Widget::~Widget() { } //鼠标拖动 #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_clicked() { ui->lineEdit->setText(ui->lineEdit->text().toUpper()); }
4、输入类
1、QComboBox : 组合框 (下拉框) addItem(” wdwe“) 添加选项 2、qfontcombox:字体下拉框 3、qlineedit: 行编辑框 setPlaceholderText(”用户名“) 添加底行注释 4、qtextedit: 文本编辑框 5、qspinbox :自选框 setMaximum(20); 最大能到20 setSingleStep(10);设置单步跨度10 6、qtimeedit :时间编辑框 7、qdial:旋钮 setRange(0, 1000);setRange(0, 1000);设置调节范围 8、qscrollbar:滚动条 setRange(0, 1000);setRange(0, 1000); 设置调节范围 setOrientation(Qt::Horizontal); 显示方案“水平” 9、qslider :滑动条 setRange(0, 1000);setRange(0, 1000);设置调节范围 setOrientation(Qt::Horizontal);显示方案“水平”
5、容器类
1、QGroupBox:分组框(带边框和注释的容器) 2、QWidget :空白框//无边框显示的容器 3、QScrollArea:滚动区域(带滚动条,可以实现小区域展示大的内容范围) setWidget() 4、QToolBox:工具箱容器(可折叠) addItem(t1, "aaaaa"); //将文本编辑框装入工具箱 5、QTabWidget:制表容器 setTabsClosable(true);//显示关闭的按钮 addTab(t1, "aaaa"); //插入一个新标签 6、QStackedWidget:栈式容器(多个页面重叠再一起) addWidget(t1)
6、其他类
#include <Qstringlist> qstringlist pixnames 等价于 vector<string> pixnames存储字符串的列表
三、Qstring常用字符处理
1、qstring构造函数结构
1、Qstring(Qchar ch);//构建单个字符(ch)的字符串的Qstring对象 2、Qstring(int size ,Qchar ch )//构建size个字符(ch)的字符串的Qstring对象 3、Qstring(const Qstring &other)//从已存在的Qstring拷贝构造 4、Qstring(Qstring &&other)//指向以存在的Qstring(两个Qstring指向同一个空间) 5、Qstring(const char * str)//从str字符串创建Qstring QString repeated(int times) const QString str("ab"); str.repeated(4); // returns "abababab"
2、添加(开头、结尾)
Qstring str; 1、 str.append(const Qstring str2);//str2加到str后 2、 str.append(const Qstring str2,int len);//str2(len个字符)加到str后 3、 str.append(qchar ch);//字符ch加到str后 prepend()//从开头加字符、字符串(用法同上) STL兼容追加函数: void push_back(const QString &other) void push_front(const QString &other)
3、数字转字符串
Qstring str; str.setnum(1234);
4、字符串转数字
Qstring str = "1234"; str.toint(str); str.tolong(); str.todouble();
5、取单个字符
const QChar at(int position) //等效于string[position] QChar back() //取最后一个字符,等效于at(size() - 1) QChar front() //取第一个字符,等效于at(0)
6、删除字符
//从末尾删除n个字符 void QString::chop(int n) //返回包含此字符串的size() - len最左字符的子字符串。原字符串不会被修改 QString QString::chopped(int len) const //清除字符串内容,并使其为空 void QString::clear() //从指定位置开始删除n个字符 QString &remove(int position, int n) //删除此字符串中出现的所有ch字符,cs参数指定了是否对大小写敏感 QString &remove(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) //删除此字符串中出现的所有str QString &remove(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) //删除所有满足指定正则表达式的子项 QString &remove(const QRegExp &rx) QString &remove(const QRegularExpression &re)
7、是否包含字符
//是否包含某个QString bool contains(const QString &str, Qt::CaseSensitivity cs = ...) const //是否包含某个字符 bool contains(QChar ch, Qt::CaseSensitivity cs = ...) const //是否包含某个拉丁字符串 bool contains(QLatin1String str, Qt::CaseSensitivity cs = ...) const //以正则表达式的形式确定是否满足包含条件 bool contains(const QRegExp &rx) const bool contains(QRegExp &rx) const bool contains(const QRegularExpression &re) const bool contains(const QRegularExpression &re, QRegularExpressionMatch *match) const
8、出现次数
//返回QString出现的次数 int count(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const //返回字符ch出现的次数 int count(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const //返回满足正则表达式条件的内容项出现的次数 int count(const QRegExp &rx) const int count(const QRegularExpression &re) const
9、指定下标获取
//参数1:目标内容(可以是QString,QChar,也可以是正则表达式) //参数2:开始查找的位置 int indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const int indexOf(QChar ch, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const int indexOf(QLatin1String str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const int indexOf(const QRegExp &rx, int from = 0) const int indexOf(QRegExp &rx, int from = 0) const int indexOf(const QRegularExpression &re, int from = 0) const int indexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const QString x = "sticky question"; QString y = "sti"; x.indexOf(y); // returns 0 x.indexOf(y, 1); // returns 10 x.indexOf(y, 10); // returns 10 x.indexOf(y, 11); // returns -1 //类似于indexOf,只不过是返回最后出现的位置 int lastIndexOf(const QString &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const int lastIndexOf(QChar ch, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const int lastIndexOf(QLatin1String str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const int lastIndexOf(const QRegExp &rx, int from = -1) const int lastIndexOf(QRegExp &rx, int from = -1) const int lastIndexOf(const QRegularExpression &re, int from = -1) const int lastIndexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const
10、判断开头与结尾
//判断是否以某个QString结尾 bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const //判断是否以某个字符结尾 bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
11、字符串填充
QString &fill(QChar ch, int size = -1) QString str = "Berlin"; str.fill('z'); // str == "zzzzzz" str.fill('A', 2); // str == "AA"
12、插入
QString &insert(int position, const QString &str) QString &insert(int position, const QChar *unicode, int size) QString &insert(int position, QChar ch) QString &insert(int position, const char *str) QString &insert(int position, const QByteArray &str) QString str = "Meal"; str.insert(1, QString("ontr")); // str == "Montreal"
13、判空、判断大小写
bool isEmpty() const bool isNull() const bool isLower() const bool isUpper() const isEmpty、isNull区别 QString().isEmpty(); // returns true QString("").isEmpty(); // returns true QString("x").isEmpty(); // returns false QString("abc").isEmpty(); // returns false QString().isNull(); // returns true QString("").isNull(); // returns false QString("abc").isNull(); // returns false //大多数情况下,用isEmpty较为稳妥
14、大小写转换
QString toLower() const QString toUpper() const QString str = "The Qt PROJECT"; str = str.toLower(); // str == "the qt project"
15、截取
//返回包含字符串最左n个字符的子字符串。 QString left(int n) const //返回包含字符串最左n个字符的子字符串,如果个数不够的话用fill填充空缺部分。 QString leftJustified(int width, QChar fill = QLatin1Char(' '), bool truncate = false) const //返回对字符串最左n个字符的子字符串引用。 QStringRef leftRef(int n) const //返回包含此字符串的size() - len最左字符的子字符串。 QString QString::chopped(int len) const //在指定位置截断字符串,会直接修改原字符串 void QString::truncate(int position) QString x = "Pineapple"; QString y = x.left(4); // y == "Pine" QString s = "apple"; QString t = s.leftJustified(8, '.'); // t == "apple..." QString x = "Pineapple"; QStringRef y = x.leftRef(4); // y == "Pine" //返回从下标position开始取的n个字符串,如果n=-1,则从下标position开始取到字符串末尾 QString mid(int position, int n = -1) const QStringRef midRef(int position, int n = -1) const QString x = "Nine pineapples"; QString y = x.mid(5, 4); // y == "pine" QString z = x.mid(5); // z == "pineapples" QString x = "Nine pineapples"; QStringRef y = x.midRef(5, 4); // y == "pine" QStringRef z = x.midRef(5); // z == "pineapples" //用法类似于left QString right(int n) const //用法类似于leftJustified QString rightJustified(int width, QChar fill = QLatin1Char(' '), bool truncate = false) const //用法类似于leftRef QStringRef rightRef(int n) const
16、根据指定项截取
//该函数首先会根据sep,将QString进行分割,然后从start开始取,取到end结束 //如果end或start为负值,则代表从右往左取 QString section(QChar sep, int start, int end = ..., QString::SectionFlags flags = SectionDefault) const QString str; QString csv = "forename,middlename,surname,phone"; QString path = "/usr/local/bin/myapp"; // First field is empty QString::SectionFlag flag = QString::SectionSkipEmpty; //[0]:"forenam" //[1]:"middlename" //[2]:"surname" //[3]:"phon" //取出开始下标为2,结束下标为2的子字符串: //str == "surname" str = csv.section(',', 2, 2); //[0]:"" //[1]:"usr" //[2]:"local" //[3]:"bin" //[4]:"myapp" //取出下标为3,结束下标为4的子字符串: //str == "bin/myapp" str = path.section('/', 3, 4); //flag指明为忽略空字符串: //[0]:"usr" //[1]:"local" //[2]:"bin" //[3]:"myapp" str = path.section('/', 3, 3, flag); // str == "myapp" //以QString分割,其他同上 QString section(const QString &sep, int start, int end = -1, QString::SectionFlags flags = SectionDefault) const //以正则表达式分割,其他同上 QString section(const QRegExp ®, int start, int end = -1, QString::SectionFlags flags = SectionDefault) const QString section(const QRegularExpression &re, int start, int end = -1, QString::SectionFlags flags = SectionDefault) const
17、指定项切割
QStringList split(const QString &sep, QString::SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const QStringList split(QChar sep, QString::SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const QStringList split(const QRegExp &rx, QString::SplitBehavior behavior = KeepEmptyParts) const QStringList split(const QRegularExpression &re, QString::SplitBehavior behavior = KeepEmptyParts) const QString str = "a,,b,c"; QStringList list1 = str.split(','); // list1: [ "a", "", "b", "c" ] QStringList list2 = str.split(',', QString::SkipEmptyParts); // list2: [ "a", "b", "c" ] QString str = "abc"; auto parts = str.split(""); // parts: {"", "a", "b", "c", ""} QString str = "/a/b/c/"; auto parts = str.split('/'); // parts: {"", "a", "b", "c", ""} //用法和上面类似,返回的是QString引用 QVector<QStringRef> splitRef(const QString &sep, QString::SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const QVector<QStringRef> splitRef(QChar sep, QString::SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const QVector<QStringRef> splitRef(const QRegExp &rx, QString::SplitBehavior behavior = KeepEmptyParts) const QVector<QStringRef> splitRef(const QRegularExpression &re, QString::SplitBehavior behavior = KeepEmptyParts) const
18、替换
//从指定下标开始替换 QString &replace(int position, int n, const QString &after) QString &replace(int position, int n, const QChar *unicode, int size) QString &replace(int position, int n, QChar after) //单个字符替换(替换所有) QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive) //将字符串中的所有befor替换为after QString &replace(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) //将字符串中的所有ch替换为after QString &replace(QChar ch, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) //将字符串中所有符合正则表达式检索条件的字符串项替换为after QString &replace(const QRegExp &rx, const QString &after) QString &replace(const QRegularExpression &re, const QString &after)
19、交换
//用这个字符串交换字符串other。这个操作非常快,从来没有失败过。 void swap(QString &other)
20、转换为string
//std String std::string toStdString() const
21、去掉开头、结尾空格
QString trimmed() const QString str = " lots\t of\nwhitespace\r\n "; str = str.trimmed(); // str == "lots\t of\nwhitespace"
四、String常见处理
1、构造函数
//将string初始化为s指向的字符串对象 string (const char* s); //构造一个n个ch字符的字符串的string对象 string(n,char ch); //构造一个string对象,与str一样 string(string str); //将string初始化为s指向字符串前n个字符 string(const char* s,n); //将string初始化为begin、end之间的字符串,其中begin、end的行为就像指针,用于指定位置,范围包括begin,不包括end template<class inet> string(inet begin, inet end) //将一个string初始化为,str中从m到结尾的n个字符的对象 string(str,m,n)