qt知识
QT安装
https://download.qt.io/archive/qt/5.9/5.9.1/
5.9版本安装方法:
http://jingyan.baidu.com/article/656db918d9292ae380249c4f.html
QT快捷键
Alt + Enter
将光标移动到h文件中的方法声明,按Alt+Enter,再按回车键将在cpp中添加对应的方法实体
F4
头文件和源文件之间切换
Ctrl + Tab
快速切换已打开的文件
Ctrl + Shift + R
局部变量统一修改(将光标移动到需要更改的变量上,按Ctrl+Shift+ R,当前变量名称外框为红色时,表示已经已激活全局修改功能,当修改此处变量名称时将一同修改代码中所有使用该变量的变量名。),全局变量开启全局替换窗口
Ctrl + M
添加/删除书签(书签也可以添加文字标注)
Ctrl + .
下一个书签
Ctrl + ,
上一个书签
Ctrl + /
多行注释/取消多行注释
QT命名规则
#include <QtWidgets>
QGroupBox *timeGroup = new QGroupBox("时间");
QPushButton *getTimeBtn = new QPushButton("获取时间");
QDialogButtonBox *dlgBtnBox = new QDialogButtonBox(Qt::Horizontal); QDateTimeEdit *dateEdit = new QDateTimeEdit(QDateTime::currentDateTime());
QGridLayout *timeLayout = new QGridLayout;
QComboBox *pwrCombo = new QComboBox;
MainWindow
setCentralWidget 可以设置任意中心部件
example
MyDialog = new QDialog();
setCentralWidget(MyDialog);
扩展效果
目前实验发现只能在对话框中实现。
setSizeConstraint(QLayout::setFixedSize)
http://blog.csdn.net/rl529014/article/details/51590317
connect(detailBtn, &QAbstractButton::toggled, extension, &QWidget::setVisible);
设置字体大小
QFont font;
font.setPointSize(28);
setFont(font)
QLineEdit
设置最大长度
ReaderIDLineEdt->setMaxLength(8);
搜索输入框,没有文字显示时显示“电影、影人”,有文字输入后不会再看到这几个字。
QLineEdit->setPlaceholderText("电影、影人");
setEchoMode()设置模式
1、默认,输入什么是什么
setEchoMode(QLineEdit::Normal);
2、密码,一般是用小黑点覆盖你所输入的字符
setEchoMode(QLineEdit::PasswordEchoOnEdit);
3、任何输入都看不见(只是看不见,不是不能输入);
setEchoMode(QLineEdit::NoEcho);
setAlignment()设置文本位置
1、setAlignment(QT::AlignLeft);
2、setAlignment(QT::AlignCentre);
3、setAlignment(QT::AlignRight);
setReadOnly()设置能否编辑
setfocus 设置焦点,比如触发按钮之间后,使用该函数可以让光标回到文本框。
QTextEdit
设置最大长度
QTextEdit是没有可以直接调用的成员函数用来设置可输入字节数的最大限制。
这边是通过信号textChanged来实时监控输入,从而控制输入的。
实现方式如下:
1、定义自己的处理槽slotTextChanged()
2、connect槽slotTextChanged和信号editChanged。
3、实现slotTextChanged如下:
QString textContent = this->toPlainText();
int length = textContent.count();
int maxLength = maxLen; // 最大字符数
if(length > maxLength)
{
int position = this->textCursor().position();
QTextCursor textCursor = this->textCursor();
textContent.remove(position - (length - maxLength), length - maxLength);
this->setText(textContent);
textCursor.setPosition(position - (length - maxLength));
this->setTextCursor(textCursor);
}
显示当前text
QString MsgSrc = messageTedt->toPlainText();
QGridLayout
addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
row:行 column:列
rowSpan:行跨度 columnSpan:列跨度
emit
自定义信号,发送信号
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
private slots:
void on_pushButton_clicked();
void mySlot();
void mySlot(int x);
void mySlotParam(int x,int y);
QListWidget QStackedWidget
查看qt历程 config
contentsWidget = new QListWidget;
contentsWidget->setViewMode(QListView::IconMode);
contentsWidget->setIconSize(QSize(96, 84));
contentsWidget->setMovement(QListView::Static);//不能移动
contentsWidget->setMaximumWidth(128);
contentsWidget->setSpacing(12);
按钮插入图片
http://jingyan.baidu.com/article/22a299b5cee0a89e18376a4f.html
- 先添加资源
右键添加新文件
选择Qt Qt Resource File
随便取个名字
完成后,工程中会出现资源目录
右键目录下的qrc,添加前缀add prefix
setSpacing
mainLayout=newQVBoxLayout(this);
mainLayout->setMargin(30); //表示控件与窗体的左右边距
mainLayout->setSpacing(40); //表示各个控件之间的上下间距
setIconSize(QSize(96, 84));
contentsWidget->setIconSize(QSize(96, 84));//图片大小不会超过96*84
QGridLayout
QGridLayout *paraLayout = new QGridLayout;
paraLayout->addWidget(pwrLabel, 0,0);
paraLayout->addWidget(pwrCombo, 0,1,1,2);//表示占用两个格子0,1和0,2
paraLayout->addWidget(pwrUnitLabel,1,1,1,3);//所以只能是1,3
QTime
QTime time(18,8,9,30);//设置时间为18时8分9秒30毫秒
QString time1 = time.toString("hh:mm:ss.zzz");//结果为18:08:09.030
QString time2 = time.toString("h:m:s.z");//结果为18:8:9.30
QString time3 = time.toString("h:m:s.z AP");//结果为6:8:9.30 PM
QString time4 = time.toString("h:m:s.z ap");//结果为6:8:9.30 pm
---------------------
作者:bwangk
来源:CSDN
原文:https://blog.csdn.net/bwangk/article/details/80793492
版权声明:本文为博主原创文章,转载请附上博文链接!
QDateTime
头文件:QDateTime
获取带日期的时间,使用QDateTime类
QDateTime current_date_time =QDateTime::currentDateTime();
QString current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd");
current_date字符串结果为"2016.05.20 12:17:01.445 周五",其中时间的显示格式可灵活配置,此处简单说明本实例中用到的部分:
yyyy表示年;MM表示月;dd表示日; hh表示小时;mm表示分;ss表示秒;zzz表示毫秒;ddd表示周几
详细配置格式内容较多,有需要的请自行查看Qt Assistant中关于函数QString QDateTime::toString ( const QString & format ) const的说明
QDateTimeEdit
QDateTimeEdit *dateEdit = new QDateTimeEdit(QDateTime::currentDateTime());
dateEdit->setDisplayFormat("yyyy/MM/dd HH:mm:ss");
dateEdit->setDateTime(QDateTime::currentDateTime());
QLabel
label->setAlignment(Qt::AlignBottom | Qt::AlignRight);
label->setFrameStyle(QFrame::Panel | QFrame::Sunken);
QString to char *
QString str1 = "Test";
QByteArray ba = str1.toLatin1();
const char *c_str2 = ba.data();
qDebug()
%a,%A 读入一个浮点值(仅C99有效)
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x,%X 读入十六进制整数
%s 读入一个字符串,遇空格、制表符或换行符结束。
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
%p 读入一个指针
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号
qDebug("s:%d",a); //格式化输出
qDebug()<<"s:"<<s;
QString
QString -> char
QString a ='b';
char b = a.toInt; //'b' 11
1. QString->char->QByteArray
QString str("LOGOUT\r\n");
str.chop(2);// str == "LOGOUT"
QString a = "128s";
a.chop; //a ="128"
char b = a.toInt;//b=0x80,默认原数据是10进制
QByteArray c;
c[0] = b;//"0x80"
qDebug() << c;//"0x80"
原数据是16进制
QString a ="f";
int a = a.toInt(&ok,16);//a = 16
QString a = QString::number(a.toInt(&ok,16));//a="16"
2. num->QString
int num = 2;
QString a = QString::number(num);//"2"
3.QString->QByteArray
QString ReaderIDSrc = "FFFFFF01"
QByteArray ReaderIDDec = QByteArray::fromHex(ReaderIDSrc.toLatin1());//"FF""FF""FF""01"
Qt char*, string, int与QString型字符串的转换
(1)将QString转换为char *
1 Qstring str;
2 char* ch;
3 QByteArray ba = str.toLatin1();
4 ch=ba.data();
注意第三行,一定要加上,不可以str.toLatin1().data()这样一部完成,可能会出错。
补充:以上方法当QString里不含中文时,没有问题,但是QString内含有中文时,转换为char*就是乱码,采用如下方法解决:
方法1: 添加GBK编码支持:
1 #include <QTextCodec>
2 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
3 QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
然后改变上面的第三行为:QByteArray ba = str.toLoacl8Bit(); toLoacl8Bit支持中文
方法2: 先将QString转为标准库中的string类型,然后将string转为char*,如下:
1 QString qstr;
2 std::string str = qstr.toStdString();//QString转换为string
3 const char* ch = str.c_str();
(2)把char*转换为QString。
示例:
1 const char *cstr;
2 QString qstr= QString(QLatin1String(cstr));
(3)把string转换为QString.
1 std::string str="hello";
2 QString qstr = QString(QString::fromLocal8Bit(str.c_str()));
(4)int(float)型转化为QString型
方法一:
1 long a = 63;
2 QString s = QString::number(a, 10); // s == "63"
3 QString t = QString::number(a, 16).toUpper(); // t == "3F"
(解释,变量a为int型或者float,double。10和16为进制) toUpper是大写
方法二:
1 long a = 63;
2 QString s = QString("%1").arg(a);
QByteArray
QString - > QByteArray
注意针对非中文
QString str1 = "Test";
QByteArray ba = str1.toLatin1(); //ba[0] = 'T';ba[1] = 'e';ba[2] = 's';ba[3] = 't';
QByteArray macAddress = QByteArray::fromHex("123456abcdef");
macAddress.toHex(':'); // returns "12:34:56:ab:cd:ef"
macAddress.toHex(0); // returns "123456abcdef"
转成16进制
QString a="AA AA AA";
QByteArray b = QByteArray::fromHex(a.toLatin1());
qDebug() << b.toHex;//"AAAAAA"
QByteArray ->QString
QString c = QString::fromLatin1(b.toHex());//"AAAAAA"
for(int i=0;i<b.length();)
{
D+=b[i];
D+=b[i+1];
D+=" ";
i=i+2;
}//D="AA AA AA"
QByteArray-> char *
QByteArray ba("Hello world");
char *data = ba.data();
while (*data) {
cout << "[" << *data << "]" << endl;
++data;
}
char->QByteArray
char a ='b';
QByteArray c = a;//'b'
char*->QByteArray
char *ch;
QByteArray byte;
byte = QByteArray(ch);
QByteArray &QByteArray::operator+=(char ch)
串口解码
QByteArray a = "CCAAAACC";
int b = a.indexOf("AA",0);//
a.remove(0,b);
qDebug() <<"开始"<< a;//"AAAACC"
ndexOf(const QByteArray &ba, int from = 0) //from对应着位置
QByteArray x("sticky question");
QByteArray 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
qDebug()
QByteArray a;
qDebug()<<a;//如果直接输出,会丢失数据
建议输出方式为:qDebug()<<a.toHex();
qDebug("Items in list: %d", myList.size());
QComboBox
QComboBox *reportTimeCombox = new QComboBox;
void QComboBox::addItem(const QString &text, const QVariant &userData = QVariant())
insertItem(int index, const QString &text, const QVariant &userData = QVariant())
ui->comBox->insertItem(1,"abc","apple");
ui->comBox->currentIndex(); //1
ui->comBox->currentText(); //abc
ui->comBox->currentData(); //apple
可选不可选设置
rssiCombox->setDisabled(true);
设置当前索引号
offsetCombo->setCurrentIndex(0);
添加项目
rssiCheckBox = new QCheckBox("RSSI过滤");
rssiCombox = new QComboBox;
QStringList rssiList;
for(uint8_t i = 0; i< 128 ;i++)
{
QString rssistr = QString::number(i);
rssistr += "dBm";
rssiList << rssistr;
}
rssiCombox->addItems(rssiList);
connect
connect(setParaBtn,&QPushButton::clicked,this,&ConfigPage::setParaBuf);//设置参数
//一个类中的信号产生另一个类的槽函数
类configpage定义
signals:
void sendsignal(QByteArray);
//类Dialog定义
public slots:
//串口发送数据
void SendData(QByteArray);
类Dialog中
connect(configpage,&ConfigPage::sendsignal,this,&Dialog::SendData);
类configpage类调用
emit sendsignal(parabuff);
就能将参数传给类Dialog
网上找的
int 转 QString
int m=1;
QString b;
b=QString::number(m)
QString 转int
QString a="1111"
int b;
b=a.toInt()
char 转换为 QString
char a='b';
QString str;
str=QString(a);
QString 转换为 char
QString str="qq";
char *ch;
ch = str.toLatin1.data();
char * 与 const char *的转换
char *ch1="tt";
const char *ch2="qq";
ch2 = ch1;//不报错,但有警告
ch1 = (char *)ch2;
QByteArray 转换为 char *
char *ch;//不要定义成ch[n];
QByteArray byte;
ch = byte.data();
char * 转换为 QByteArray
char *ch;
QByteArray byte;
byte = QByteArray(ch);
QString 转换为 QByteArray
QByteArray byte;
QString string;
byte = string.toAscii();
QByteArray 转换为 QString
QByteArray byte;
QString string;
string = QString(byte);
示例:
qDebug()<<"qq";
qDebug()<<tr("tt");
qDebug()<<ch;(ch 为char类型)
qDebug()<<tr(ch);
qDebug()<<byteArray;(byteArray是QByteArray类型)
qDebug()<<tr(byteArray);
qDebug()<<str;(str 为Qstring类型)
但是qDebug()<<tr(str);是不可以的,要想用tr()函数输出QString类型的字符则要如下:
qDebug()<<tr(str.toLatin1);
QString string
QString s2q(const string &s)
{
return QString(QString::fromLocal8Bit(s.c_str()));
}
string q2s(const QString &s)
{
return string((const char *)s.toLocal8Bit());
}
汉子转GBK
QString -> GBK
方法一:
QString a = "啊小";
qDebug() <<"toLocal8Bit" << a.toLocal8Bit()<<endl; //b0a1d0a1 得到的是GBK码
windows中toLocal8Bit对应着GBK码
qDebug() <<"toUtf8" << a.toUtf8()<<endl;
方法二:
QTextCodec* textCode = QTextCodec::codecForName("GB18030");
QByteArray MsgDest = textCode->fromUnicode(a);//b0a1d0a1
qDebug() << MsgDest.toHex();//b0a1d0a1
qDebug() << textCode->toUnicode(MsgDest);//"啊小"
自己写的函数
//qstring(unicode)->gbk
QByteArray ConfigPage::U2GBK(QString unic)
{
QTextCodec* pCodec = QTextCodec::codecForName("GB18030");
QByteArray gbk = pCodec->fromUnicode(unic);
return gbk;
}
//qstring(unicode)->unicode
QByteArray ConfigPage::QString2Unicode(QString src)
{
QByteArray unic;
for(int i=0;i<src.length();i++)
{
const QChar a = src.at(i);
ushort s = a.unicode();
char data_h = (char)(s>>8);
char data_l = (char)(s);
unic+=data_h;
unic+=data_l;
}
return unic;
}
#include <QTextCodec>
inline QString GBK2UTF8(const QString &inStr)
{
QTextCodec *gbk = QTextCodec::codecForName("GB18030");
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
QString g2u = gbk->toUnicode(gbk->fromUnicode(inStr)); // gbk convert utf8
return g2u;
}
inline QString UTF82GBK(const QString &inStr)
{
QTextCodec *gbk = QTextCodec::codecForName("GB18030");
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
QString utf2gbk = gbk->toUnicode(inStr.toLocal8Bit());
return utf2gbk;
}
inline std::string gbk2utf8(const QString &inStr)
{
return GBK2UTF8(inStr).toStdString();
}
inline QString utf82gbk(const std::string &inStr)
{
QString str = QString::fromStdString(inStr);
return UTF82GBK(str);
}
帮助按钮
void Dialog::OnHelp()
{
QString runPath = QCoreApplication::applicationDirPath(); //获取exe路劲。
QString helpName = "帮助文档.txt";
QString helpPath = QString("%1/%2").arg(runPath).arg(helpName);
QFile bfilePath(helpPath);
if(!bfilePath.exists()){
return;
}
QString filePath = "file:///" + helpPath; //打开文件夹用filse:///,打开网页用http://
QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));
}
QTableView用法小结
QTableView常用于实现数据的表格显示。下面我们如何按步骤实现学生信息表格:
一 添加表头
//准备数据模型
QStandardItemModel *student_model = new QStandardItemModel();
student_model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("Name")));
student_model->setHorizontalHeaderItem(1, new QStandardItem(QObject::tr("NO.")));
student_model->setHorizontalHeaderItem(2, new QStandardItem(QObject::tr("Sex")));
student_model->setHorizontalHeaderItem(3, new QStandardItem(QObject::tr("Age")));
student_model->setHorizontalHeaderItem(4, new QStandardItem(QObject::tr("College")));
//利用setModel()方法将数据模型与QTableView绑定
ui->student_tableview->setModel(student_model);
二 设置表格属性
//设置列宽不可变动,即不能通过鼠标拖动增加列宽
ui->student_tableview->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
ui->student_tableview->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
ui->student_tableview->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);
ui->student_tableview->horizontalHeader()->setResizeMode(3, QHeaderView::Fixed);
ui->student_tableview->horizontalHeader()->setResizeMode(4, QHeaderView::Fixed);
//设置表格的各列的宽度值
ui->student_tableview->setColumnWidth(0,100);
ui->student_tableview->setColumnWidth(1,100);
ui->student_tableview->setColumnWidth(2,100);
ui->student_tableview->setColumnWidth(3,100);
ui->student_tableview->setColumnWidth(4,100);
//默认显示行头,如果你觉得不美观的话,我们可以将隐藏
ui->student_tableview->verticalHeader()->hide();
//设置选中时为整行选中
ui->student_tableview->setSelectionBehavior(QAbstractItemView::SelectRows);
//设置表格的单元为只读属性,即不能编辑
ui->student_tableview->setEditTriggers(QAbstractItemView::NoEditTriggers);
//如果你用在QTableView中使用右键菜单,需启用该属性
ui->tstudent_tableview->setContextMenuPolicy(Qt::CustomContextMenu);
三 动态添加行
在表格中添加行时,我们只需要在model中插入数据即可,一旦model中的数据发生变化,QTabelView显示就会做相应的变动
//在第一行添加学生张三的个人信息(setItem函数的第一个参数表示行号,第二个表示列号,第三个为要显示的数据)
student_model->setItem(0, 0, new QStandardItem(“张三"));
student_model->setItem(0, 1, new QStandardItem("20120202"));
student_model->setItem(0, 2, new QStandardItem("男"));
student_model->setItem(0, 3, new QStandardItem("18"));
student_model->setItem(0, 4, new QStandardItem("土木学院"));
四 设置数据显示的样式
//设置单元格文本居中,张三的数据设置为居中显示
student_model->item(0, 0)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 1)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 2)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 3)->setTextAlignment(Qt::AlignCenter);
student_model->item(0, 4)->setTextAlignment(Qt::AlignCenter);
//设置单元格文本颜色,张三的数据设置为红色
student_model->item(0, 0)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 1)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 2)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 3)->setForeground(QBrush(QColor(255, 0, 0)));
student_model->item(0, 4)->setForeground(QBrush(QColor(255, 0, 0)));
//将字体加粗
student_model->item(0, 0)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 1)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 2)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 3)->setFont( QFont( "Times", 10, QFont::Black ) );
student_model->item(0, 4)->setFont( QFont( "Times", 10, QFont::Black ) );
//设置排序方式,按年龄降序显示
student_model->sort(3, Qt::DescendingOrder);
QSerialPort
自动更新串口
http://www.cnblogs.com/worldsing/p/3944806.html
定时器
timer = new QTimer;
connect(timer,&QTimer::timeout,this,&serial::UpdatePort);//更新端口号
timer->start(1000);
QStringList newPortStringList;
const auto infos = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : infos)
{
newPortStringList += info.portName();
}
//更新串口号
if(newPortStringList.size() != oldPortStringList.size())
{
oldPortStringList = newPortStringList;
serialPortComboBox->clear();
serialPortComboBox->addItems(oldPortStringList);
}
QFile
QFile file("L:/qtpro/_qtApp/text/t.txt");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QByteArray t = file.readAll();
ui->text_r->setText(QString(t));
file.close();
QFile file;
QDir::setCurrent("/temp");
file.setFileName(name);
file.open(QIODevice::ReadOnly|QIODevice::)
QFile file("L:/qtpro/_qtApp/text/e.txt");
file.open(QIODevice::WriteOnly | QIODevice::Text);
file.write(e.toUtf8());
file.close();