赞
踩
本人会些Java、C++,速成做了Qt前端工程师,但是做项目时遇到很多不懂或问题,想在此分享于大家,也方便自己回顾;若有关于Qt问题,可评论提出,或许能帮些忙;若编写有误,也可评论,我会积极纠正的,提前道声谢谢~
安装或异常解决方案文档:
链接:https://pan.baidu.com/s/18a7CKGmvMTKwVK6fv7YEfg 提取码:xjjx
找到Qt5.8SetUp文件夹,下载之后,双击安装—》安装时一定要勾选Tools的MinGW选择(默认不勾选),否则后面项目运行会报错—》安装时,可能会弹出警告
Cannot find file: E:\Qt程序\day.pro. When executing step "qmake"的问题
Qt Creator 报错:Error while building/deploying project helloworld (kit: Desktop Qt 5.6.2 MinGW 32bit) When executing step “qmake”【当我安装Qt5.8.0时未勾选Tools的MinGW环境配置,当我项目运行时,就会报这样的异常(当时环境配置是Qt默认环境),我使用过文章的“方法一”,似乎也不奏效,可能问题源头是“未配置MinGW”】
OrQt学习一: Qt 在 win7 的安装和环境配置【图的“1、”是方案二,图的“2、”是方案一】
QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015)【简单粗暴的讲解,当时只觉得唯有这个是有用的信息:跳转Qt官方Qt5.8.0版本的软件下载链接】
[下面俩文章,我暂时未用过]
QT creator 5.8.0/5.9+opencv2.4.13.6安装与配置方法
QT5.12安装图文教程与安装成功后环境配置详细教程
参考:
32位系统为什么又叫x86系统呢?
Any CPU X86 X64区别
//设置输入文本框的文本为Timers格式字体、20大小、粗体
ui->lineEditText->setFont(QFont("Timers",20,QFont::Bold));
Or
QLineEdit *lineEdit;
lineEdit->setFont(QFont("Timers",20,QFont::Bold));
//设置"无效的角度值!"字符串为Timers字体格式、9大小、红色的粗体
QPalette palette;
palette.setColor(QPalette::WindowText,Qt::red);//QLineEdit以及QLabel的文本颜色就用QPalette::WindowText
ui->lab->setText("无效的角度值!");
ui->lab->setFont(QFont("Timers",9,QFont::Bold));
ui->lab->setPalette(palette);
Or
QLabel *label;
label->setText("无效的角度值!");
label->setFont(QFont("Timers",9,QFont::Bold));//第一个参数设置字体格式,第二个参数设置字体大小,第三个参数设置字体粗体
label->setPalette(palette);
另一种:
QString Setting =tr("Language");
ui->label->setText(Setting);
Font.setPointSize(20);//设置字体大小
ui->label->setFont(Font);
Palette.setColor(QPalette::WindowText,Qt::white);//字体是白色的
ui->label->setPalette(Palette);
//在构造函数中,set ui LineEdit filter过滤器 ui->lineEdit->installEventFilter(this); ------------------------------------------------- #include <QKeyEvent> bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if (watched == ui->lineEdit)//首先判断控件(这里指 lineEdit)【判断是否是被事件过滤器过滤的对象】 { if (event->type() == QEvent::FocusOut)// 这里指 lineEdit 控件的失去焦点事件 { lEdit = ui->lineEdit->text(); if("" != lEdit.trimmed()) { ...... } else if("" == lEdit.trimmed()) { ui->lineEdit>setText("0"); } } //该if语句,可忽略,作用:按了回车键,会做出指定反应 if (event->type() == QEvent::KeyPress) { QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event); if(keyEvent->key() == Qt::Key_Return)//更改文本框内的值,按“Enter”键执行位置模式指令 { int count; double angle; ...... } } } }
include( $${PWD}/../../。。。/examples/examples.pri )
PS:若多个pri文件,最好集成于一个example.pri中,而在pro文件中,include的example.pri即可(include括号里的路径中不能出现回车符或者空格,否则系统找不到对应的文件)
Linux中的Qt软件:
1.将xxx.c拷贝到项目中(若有src文件夹,可放入其中)
2.如图所示,在Qt项目的源文件上鼠标右键,弹出“添加现有文件”
3.弹出“文件管理器”,选中项目目录下对应的xxx.c,再点击Open按钮即可
4.然后xxx.c导入成功了,如图所示,但这还不算结束
xxx.c大概内容:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdint.h> #include <unistd.h> typedef uint8_t __u8; typedef int32_t __s32; typedef uint16_t __u16; ...... struct ixxta { char read_write; __u8 command; int size; union ixta *data; }; ...... void xxxge(char *file) { printf("%s ... r addr\n",file); printf("%s ... w addr val\n",file); } ...... int ixxxta() { const char *v = "ixxx-0"; const char *v1 = "0x34"; const char *v2 = "0xB9"; ...... return 1; }
5.要建同名的xxx.h,在里面定义xxx.c中声明了的函数,如图所示:
xxx.h大概内容:
typedef uint8_t __u8;
typedef int32_t __s32;
typedef uint16_t __u16;
extern "C"
{
void xxxge(char *file);
......
int ixxxta();
}
6.最后,若在xxx类(如:mainWindow)中要调用,可直接include,然后在xxx.cpp(如:mainWindow.cpp),可以根据个人想法直接调用“xxxge”、“ixxxta”等函数
为什么会这么问,在创建Qt Quick项目的时候遇到了,心有疑惑则需立即解答:
可以是MSVC2015/2017的,但可能出现“感叹号”,所以可改用MinGW编译器
MyDialog myDlg;
myDlg.setModal(true); myDlg.show();//模态
myDlg.setModal(false);或者myDlg.setModal(); myDlg.show();//非模态
myDlg.exec();
#ifndef 本文件的头文件名全大写XXX_H
#define 本文件的头文件名全大写XXX_H
........某内容.......
#endif
\ | #if | if |
---|---|---|
名称 | 条件编译 | 条件语句 |
介绍 | 是C语言中预处理部分的内容,它是编译器编译代码时最先处理的部分 | 是 C 语言中的关键字,它根据表达式的计算结果来觉定执行那个语句,它里面的每个分支都编译了的 |
简单说 | 根据 宏条件 选择性地编译语句,它是编译器在编译代码时完成的 | 根据条件表达式选择性地执行语句,它是在程序运行时进行的 |
代码 | qb-01区代码 | qb-02区代码 |
意思 | 如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译 | 做A条件判断 |
什么时候用 | 如果你的条件在程序编译前就已经确定了,那就用#if | 如果条件需要在程序运行过程中才能判断,则用if |
qb-01:
#define A 0 //把A定义为0
#if (A > 1)
printf("A > 1"); //编译器没有编译该语句,该语句不生成汇编代码
#elif (A == 1)
printf("A == 1"); //编译器没有编译该语句,该语句不生成汇编代码
#else
printf("A < 1"); //编译器编译了这段代码,且生成了汇编代码,执行该语句
#endif
qb-02:
#define A 0
if (A > 1)
printf("A > 1"); //编译器编译该语句,但因为A == 0 未执行
else if(A == 1)
printf("A == 1"); //编译器编译该语句,但因为A == 0 未执行
else
printf("A < 1"); //编译器编译该语句,因为A == 0 故执行
int value = 4;//二进制为0100
QString convertedValue = QString("%1").arg(value,4,2,QLatin1Char('0')).toUpper();
QByteArray ba = convertedValue.toLatin1();
ba[2] = 1;//ba == 0110;
static QString number(int value, int base=10);
【若base值未赋值,默认为10】可以用于“int类型转成QString类型”
int val = 6;
QString str = QString::number(val);
错误:QString str = new QString() 或 new QString 或 new QString("43");
否则,报错:"错误:从'QString*'转换为请求的非标量类型'QString'"
正确:QString str = "";或QString str;
参考:
《SQL与关系数据库理论——如何编写健壮的SQL代码》一一2.5 标量类型vs.非标量类型
错误:转换为非标量类型(Error: Conversion to non-scalar type)
错误:从“基本类型”转换为请求的非标量类型“NamedType <基本类型>”
const QString string( "abcdefgh" );
QChar ch = string.at( 4 );// 打印ch == 'e'
QString str = "After finishing the homework,she does her housework~";
qDebug() << "str[2] = " << str.at(2);//打印:str[2] = 't'
1. QString m = tr("%1:%2:%3").arg("12").arg("60").arg("60"); //结果是m = "12:60:60" 2. QString QString::arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const [在QString头文件:inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const] 分析: 第一个参数是要填充的数字(一定是十进制,若二进制数值传入,也会被认为是"十进制"数值), 第二个参数为最小宽度, 第三个参数为进制, 第四个参数为当原始数字长度不足最小宽度时用于填充的字符 如: QString text = QString("%1:%2") .arg(123, 5, 10, QChar('0')) .arg(456, 5, 10, QChar('0')); //结果是text = "00123:00456"
从QString头文件看出:一个arg()函数最多实现九个参数;
若一定要实现九个以上的参数值呢,可以这样:
QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11")
.arg("1","2","3","4","w","6","7","8","9").arg("a","b");
//结果是:"1 2 3 4 5 6 7 8 9 a b"
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
QString str1("F");
int i1 = str1.toInt(0,16);
qDebug() << i1 << " = i1~~~";
如: int data = 123; QString convertedValue = QString("%1").arg(data,16,2,QLatin1Char('0')).toUpper(); //arg()函数在上面已说明,int类型的data转QString类型,而toUpper()函数:把小写字母转换为大写字母。 QByteArray ba = convertedValue.toLatin1();//将QString转QByteArray类型 ba[15] = '1';//可以直接更改QByteArray某index的字符 std::string str = ba.toStdString(); //QByteArray的toStdString()专门从QByteArray转成std::string类型 /* 该语句就是你们要找的!!! */ QString convertedValue1 = QString::fromStdString(str); //利用QString的fromStdString函数,将std::string类型转成QString类型 或者 QString qstr = QString::number(123);//int类型的数据转QString类型 string s = qstr.toStdString();//除了QByteArray有toStdString(),QString也有 QString qstr2 = QString::fromStdString(s);//将std::string类型转成QString类型
参考:
该函数,在 进制间的转换 方面中,起到很大作用:
C++中二进制、字符串、十六进制、十进制之间的转换
【c++ 二进制字符串转成10进制数】
函数 | 描述 |
---|---|
QTextCodec::setCodecForCStrings(textc) | 主要用在用字符常量或者QByteArray构造QString对象时使用的默认编码方式。 |
QTextCodec::setCodecForTr(textc) | 这个函数的作用是设置传给tr函数时的默认字串编码。 |
QTextCodec::setCodecForLocale(textc) | 这个函数主要用于设置和对本地文件系统读写时候的默认编码格式。 |
QString convertedValue = QString("%1").arg(data,16,2,QLatin1Char('0')).toUpper();
//arg()函数在上面已说明,int类型的data转QString类型,而toUpper()函数:把小写字母转换为大写字母。
QByteArray ba = convertedValue.toLatin1();//将QString转QByteArray类型
ba[15] = '1';//可以直接更改QByteArray某index的字符
std::string str = ba.toStdString();
//QByteArray的toStdString()专门从QByteArray转成std::string类型
QWidget *m_statusInd = new QWidget;
m_statusInd->setFixedSize( 16, 16 );
m_statusInd->setStyleSheet("background-color: red");
//使用部件Widget的setStyleSheet函数
void setFocusPolicy(Qt::FocusPolicy policy);
属性 | 表示的十六进制 | 描述 |
---|---|---|
Qt::TabFocus | 0x1 | 接受Tab键焦点 |
Qt::ClickFocus | 0x2 | 接受鼠标单击做焦点 |
Qt::StrongFocus | TabFocus or ClickFocus or 0x8 | 接受Tab键和鼠标单击做焦点 |
Qt::WheelFocus | StrongFocus or 0x4 | 滑轮作为焦点选中事件 |
Qt::NoFocus | 0 | 不接受焦点 |
#include <QLineEdit>//若头文件没有继承QWidget,就要加上这个
QLineEdit *edit = new QLineEdit;
edit->setFocusPolicy(Qt::StrongFocus);//默认使用Qt::StrongFocus属性
this->setWindowTitle("Qt系统");
this->setWindowIcon(QIcon(":/img/logo.png"));
inline void addItem(const QString &text, const QVariant &userData = QVariant());
for(int i=0; i<8; i++)
ui->cmbCode->addItem(QString::number(i));
void setEnabled(bool);
#include <QDebug> //qDebug()要求的
#include <QTimer> //QTimer要求的
#include <synchapi.h> //Sleep()要求的
QTimer *ti = new QTimer(this);
ti->start(1000);
qDebug() << "Start to sleep 10 seconds~~";
QThread::sleep(10);
qDebug() << "End to sleep 10 seconds But start to Sleep 15 seconds~~";
Sleep(15000);
qDebug() << "End to Sleep 15 seconds~~";
double pow( double x, double y );
运用:
二进制字符串转为十进制数值
QString val = "0000000010001100";
QByteArray ba = val.toLatin1();
int nVal = 0;
for(int i = 15;i>=0;i--)
{
if(ba[i] == '1')
{
int t = 15-i;
nVal += pow(2, t);//2的t次幂
}
}
QString chin = "中文繁体";
qDebug() << chin.toStdString().c_str();
char da = 'a';
qDebug("%04x",da);
qDebug()<< "MainWindow : Init Completed ";
qDebug() << "Hello" << 123;
qDebug() << QString("Hello") << QPoint(10, 10);
int num = 20;
char str[20]="hello world";
qDebug("如果只写在括号里,是不需要QDebug头文件的 %d %s", num, str);
QSettings st = new QSettings("qModMaster.ini",QSettings::IniFormat);
//IniFormat存储格式:'读写配置ini文件'可以储存一些系列配置,即将设置存储在INI文件中。
void setEditable(bool editable);
QStandardItemModel(int rows, int columns, QObject *parent = Q_NULLPTR);
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
void setItem(int row, int column, QStandardItem *item);
//在头文件的类外定义声明 static const int AddressColumn=0; static const int ValueColumn=1; //在cpp中的类的函数中定义声明 int m_startAddress = 2;//设置开始的索引号从2开始 int m_noOfItems = 4;//读取指定表格的两列四行(或者指四项[是"键-值"————“addressItem-valueItem”的形式]) for (int row = 0; row < m_noOfItems ; row++) { //将int类型转QString类型赋值于QStandardItem的addressItem变量 QStandardItem *addressItem = new QStandardItem(QString::number(m_startAddress+row)); model->setItem(row, AddressColumn, addressItem);//设置addressItem放在 row从0开始遍历的对应行 及 索引号为0的列 中(即,addressItem放在每行的第一列) addressItem->setEditable(false);//设置addressItem项不可编辑,不可双击或点击触发编辑事件 QStandardItem *valueItem = new QStandardItem("-");//设置valueItem的值为字符"-" model->setItem(row, ValueColumn, valueItem);//让valueItem放在每行的第二列 //valueItem->setEditable(valueIsEditable);//若为false,调用这个函数的控件不能被编辑,如果设为true或者不调用这个函数,则控件可以编辑。 }
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
static const int ValueColumn=1;//在头文件的类外定义声明 //在cpp中的类的函数中定义声明 QStandardItemModel *model = new QStandardItemModel(0,2,this); //以代码所在的该类为基类,初始化:一行两列的表格;第一参数,指的是行下标index;第二参数,指的是表格的每行有几列。 for (int i = 0; i < m_noOfItems; i++) { QModelIndex index = model->index(i, ValueColumn, QModelIndex()); //取下标为i,第valueColumn列的QModelIndex类型的索引号 //qDebug() << index << " = index!"; //若i=0,打印QModelIndex(0,1,0x18da0380,QStandardItemModel(0x18d29be8)) = index! model->setData(index,"N/A",Qt::DisplayRole); //将索引号index行列要显示出来(DisplayRole角色属性)的值设置为"N/A", }
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
//根据内容自动调整所有列的列宽
//设置表格的列与内容相匹配
ui->tblView->resizeColumnsToContents();
//我将放在mainWindow.cpp的某函数中,起作用了呀!
//【若你的未起作用,可以看看第三篇文章,或许对你有帮助】
参考:
参考:
继承了QTreeView类:
static StandardButton critical(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton);
//弹出窗口最多有三个按钮,超三个就会报错!
QMessageBox::critical(this, "Request failed","Add items to Registers Table.","Ready","Cancel","Close");
//设置三个或者两个按钮后,右上角的红×都是失效的!
//默认第一个按钮亮起蓝色框,按钮文本可以用中文表示
//只有设置一个按钮或者使用默认按钮OK的时候,右上角的红×才是有效的!
QMessageBox::critical(this, "Request failed","Add items to Registers Table.","Ready");
QString errorDetails = "404";
第三参数可以是:(拼接的字符串)
QString("An internal error occurred. Please ") +
"call technical support at 123456789 and report\n"+
"these numbers:\n\n" + errorDetails +
"\n\n<Application> will now exit."
e.g:
msg001:
msg002:
msg001:QMessageBox::warning(this,"Information",tr("文本框内容不许为空!!!"));
msg002:QMessageBox::information(this,"Information",tr("connection ok"));
void setChecked(bool);
void setChecked(bool);
void setCheckable(bool);
ui->btTest->setCheckable(false);//表示btTest按钮不可选中,特征:呈灰色,不可点击
A类: .h里: Q_SIGNALS: void SShowB(); .cpp里: 按键释放事件函数里: switch (event->key()){ case Qt::Key_M:{ hide();//隐藏当前或A类窗口 emit SShowB(); } } B类: .h里: private: A a; B b; public slots: void SlotShowThisWindow(); .cpp里: 在构造函数里: connect(&a,SIGNAL(SShowB()),this,SLOT(SlotShowThisWindow()));//显示当前窗口 声明SlotsShowB函数: void SlotShowThisWindow(){ show(); //显示当前或B类窗口 }
比如使用QT获取0-10之间的随机数
#include <ctime>
//这里以时间为种子
qsrand((quint32)time(0));
int res = 0+qrand()%10;
qsrand(QTime::currentTime().msec()); //取时间作为产生随机数的种子
timer->start(qrand()%5000+1000);//qrand()%5000+1000是产生一个在 1000-6000间的数,timer->start()是根据上述产生的数值来启动定时器
#include <QRegExp> bool MainWindow::validate(QString str) { QString regexStr("^(-?\\d+)|(-?\\d+)(\\.\\d+)$");//Qt匹配正数、负数、浮点数;若结尾是.或-【若出现正负数、浮点数以外的值】,match==false QRegExp regex(regexStr);//QRegExp regex = new QRegExp(regexStr);会报错 bool match = regex.exactMatch(str);//检查传进来的str字符串是否符合指定的正则表达式,符合为true,反之亦然 if (match) return true; else return false; } QString arg1 = "-32.3"; bool a = validate(arg1.trimmed()); //打印 a==true QString arg2 = "。"; bool b = validate(arg2.trimmed()); //打印 b==false
跟QDir有关
QStringList filter;
filter << "*.jpg" << "*.h264";
dir2.setNameFilters(filter);
函数 | 描述 |
---|---|
globalPos() | 给出的坐标信息是相对于桌面的,即以桌面左上角为原点。 |
pos() | 是相对于窗口的,以窗口左上角为原点(去除边框)。 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。