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

  1. 先添加资源
    右键添加新文件
    选择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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值