QT常用基本功能

QT菜单栏打开新窗口
void MainWindow::on_actionUART_triggered()
{
Serial *config_serial_Window = new Serial();
config_serial_Window->setWindowModality(Qt::ApplicationModal);//设置模态对话框
config_serial_Window->setAttribute(Qt::WA_DeleteOnClose);//窗口关闭自动释放内存
config_serial_Window->show();
}

QT提取lineedit中输入的数据。
QString str=ui->lineEdit_address->text();
bool ok;
char address = str.toInt(&ok,10);//将获取的数值转换成自己需要的类型。
if(ui->lineEdit_SPD_Hz->text().isEmpty())//如果为空
{
QMessageBox::about(this,“注意”,“请输入SPD目标速度!”);
return;
}
设置lineedit显示的内容:
ui->lineEdit->setText(fileName);
转换成 hex格式:
int myValue = 0x1234;
QString valueInHex= QString(“%1”).arg(myValue , 0, 16);
qDebug() << “value = " << valueInHex;
qDebug(“数据=: %d%%”, rate); // % 输出
输出16进制
QByteArray rx_data;
qDebug()<<“length is “<< rx_data.size()<<” frame:”<< rx_data.toHex(‘:’);;
qDebug() << “data:” << hex << a; //输出16进制原型
qDebug() << QString(”%1").arg(a , 0, 16).toUpper(); //输出16进制大写
int转QString
int i = 5;
QString s = QString::number(i);

QT提取时间
QDateTime dateTime = QDateTime::currentDateTime();
QString timestamp = dateTime.toString(“yyyy-MM-dd hh:mm:ss.zzz”);

tableWidget控件的应用。
QStringList head_list;
head_list<<“震动传感器1”<<“震动传感器2”;
ui->tableWidget_shake->setColumnCount(head_list.size());
//设置水平头
ui->tableWidget_shake->setHorizontalHeaderLabels(head_list);
//设置行的数量
ui->tableWidget_shake->setRowCount(10);
int num=23;
ui->tableWidget_shake->setItem(0,0,new QTableWidgetItem(QString::number(num)));
ui->tableWidget_shake->setItem(1,0,new QTableWidgetItem(QString::number(num+1)));

弹出提示框:
QMessageBox::about(this,“注意”,“请输入SPD目标速度!”);
QString dlgTitle = “warning 消息框”;
QString strInfo = “文件内容已经被修改”;
QMessageBox::warning(this, dlgTitle, strInfo);

QString dlgTitle = “information消息框”;
QString strInfo = “文件已经打开,字体大小已设置”;
QMessageBox::information(this, dlgTitle, strInfo
, QMessageBox::Ok, QMessageBox::NoButton);

QString dlgTitle = “critical消息框”;
QString strInfo = “有不明程序访问网络”;
QMessageBox::critical(this, dlgTitle, strInfo);
QString dlgTitle = “about消息框”;
QString strInfo = “我开发的数据查看软件 V1.0 \n 保留所有版权”;
QMessageBox::about(this, dlgTitle, strInfo);

关于delete:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QLabel *label =new QLabel(“hello”,&w);
//这里使用new之后不需要执行delete,因为label的父类是w,而w是在栈中创建,在程序关闭的时候会自动释放,所以作为w的子类内存也被释放。
QLabel *label1 =new QLabel(“world”);
//这个是需要执行delete label1,否则会造成内存泄漏,因为label没有父类,所以不会为label释放内存
w.show();
a.exec();
delete label1;
label1=NULL;
return 0;
}

checkbox的应用:
学习CheckBox复选框的主要关注三个方面:
1、有哪些属性:在设计器中可以查看属性;
2、查看文档,他有哪些操作函数;
bool isChecked() const; 是否被选中。
void setChecked(bool); 让他选中或者取消选中。True or False 。
if(ui.cbxAgree->isChecked())
{
ui.btnNext->setEnabled(true);
}
else
{
ui.btnNext->setEnabled(false);
}
label显示数据:
ui->label_send_radar_cmd_num->setText(QString::number(now_system_status.now_system_radar_status.now_param.total_send_command_num));
ui->label_received_right_radar_frame->setText(QString::number(now_system_status.now_system_radar_status.now_param.received_right_command_num));
ui->label_received_error_radar_frame->setText(QString::number(now_system_status.now_system_radar_status.now_param.received_error_command_num));
//在原有显示的基础上添加。
ui->textEdit_Tx_Rx->append(Tx_Rx+timestamp +"数据: “+“0x”+CAN_ID_hex +” "+ CAN_Data.toHex(’ '));

Qdebug输出:
qDebug(“Test:%d”,id); (%d表示整数)
3.格式化信息
%c 读入一个字符   
%d 读入十进制整数   
%x,%X 读入十六进制整数   
%s 读入一个字符串,遇空格、制表符或换行符结束。   
%f,%F 用来输入实数,可以用小数形式或指数形式输入。

3.输出在应用程序输出中可见。release不需删除调试代码。

QT中,开始线程的接口为Qthread调用start()函数来进行开启线程;

此处不是简单的理解为start后进入线程的run()函数,进而进行线程运行;

start()仅仅代表线程准备的意思,何时进入run()阶段,取决于操作系统的调度,在众多就绪线程中,按照优先级and操作系统自身的特性,进行开启which线程,才进入到run()。

线程退出:
thread ->disconnect();//然后使用
thread ->quit();//退出线程请求
thread ->wait();//使线程正常退出。

QT修改exe图标:
使用qmake来生成makefile文件,只需要在.pro中添加:
RC_ICONS = logo.ico
然后,重新生成makefile文件和应用程序,对应的.exe可执行程序就被设置好图标了。(这种方法,要将logo.ico和.pro文件放到同一个文件夹下)

QTableWidget是QT中的表格控件。
行表头,用于设置每一列的标题。
行表头,通常用于显示行号。
设置每列列宽均匀填充控件:
ui->tableWidget_base_parameter->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
通过设置表头的 StyleSheet 根据需要绘制上下左右四个边界线。
横向表头
ui.tableWidget->horizontalHeader()->setStyleSheet(
“QHeaderView::section{”
“border-top:0px solid #E5E5E5;”
“border-left:0px solid #E5E5E5;”
“border-right:0.5px solid #E5E5E5;”
“border-bottom: 0.5px solid #E5E5E5;”
“background-color:white;”
“padding:4px;”
“}”
);
//双击单元格的信号与槽函数。
connect(ui->tableWidget_base_parameter,&QTableWidget::cellDoubleClicked, this,&Set_Parameter::on_base_parameter_ItemClick);
void Set_Parameter::on_base_parameter_ItemClick(int row, int column);

QTabWidget控件用于通过多标签显示不同内容。

释放创建的文件
void recvfile::run()
{
QFile *file = new QFile(“recv.txt”);
file->open(QFile::Writeonly);

//退出时候释放:
file->close(); //先关闭
file->deletelater();//再删除
}

子线程后面添加exec();可相当于while()的功能。

槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。
sleep函数的精度非常低,当系统越繁忙的时候它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素,所以说sleep函数是不能用来精确计时的。

QT弹出新窗口:
dialog_warn_process=new Warning_Process(this);//之前忘了写这句,不能弹出窗口
dialog_warn_process->setAttribute(Qt::WA_DeleteOnClose);//自动析构。
dialog_warn_process->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);//Qt::Dialog是必须的
dialog_warn_process->setWindowModality(Qt::WindowModal);//Qt::WindowModal是必须的

    dialog_warn_process->show();

hide是隐藏窗体,不会发送任何信号。

close会隐藏窗体 ,会触发closeEvent,你可以自己重写closeEvent来控制隐藏或不隐藏,或自己的逻辑,但是默认情况下是不会触发窗体的析构函数的;如果需要触发析构函数,需要Qt::WA_DeleteOnClose标志影响窗体在内存中的状态。

如果你窗体是new出来的,系统close后迪触发窗体析构函数:
方法1:setAttribute(Qt::WA_DeleteOnClose); (如果不是new出来的,使用本方法,close可能会出现异常)
方法2: exec后,执行delete 对象即可;

QT中的延时函数比较常用的三种方法
第一种:
void MainWindow::Delay(int msec)
{ // 这个最准
/非阻塞方式延时,现在很多人推荐的方法/
QEventLoop loop;
QTimer::singleShot(msec, &loop, SLOT(quit()));
loop.exec();
}

LINUX下按下F1没有弹出帮助界面,则安装帮助文档。
sudo apt install qt5-doc

void MainWindow::InitSerialPortName()
{
// 清空下拉框
ui->box_portName->clear();

//通过QSerialPortInfo查找可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
    QString showName = info.portName()+":"+info.description();
    qDebug() << showName.length();
    ui->box_portName->addItem(showName);
}

}

QTimer定时器不能在不同的线程中启动。
出现这个主要原因是没有很好的将主线程和子线程进行区分。
我们看以下的多线程代码:(在Qt中的多线程)
这个是定义一个类继承自QThread,并且重写其中的虚函数run。之后,启动线程run函数就在子线程中运行了。
注意:只有run函数的函数体中的内容是在多线程中运行的。MyThread的成员函数都属于主线程。
QObject::startTimer: Timers cannot be started from another thread
出现这个原因:主要是在主线程中进行Qtimer在堆中的内存分配,因此,该定时器属于同一个线程,如果在子线程中进行start,那么就会在别的线程中开启主线程中的定时器。Qt不允许这样操作。
修改方法:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
qDebug()<<“Main ThreadID”<< this->thread()->currentThreadId();
// t1.moveToThread(&t1);
t1.start();
}
void MyThread::run()
{
// connect(&timer,&QTimer::timeout,this,{qDebug()<<“Timer goes”;});
//不能加this
timer = new QTimer();
timer->setInterval(90);
connect(timer, &QTimer::timeout, this, &MyThread::wode);
timer->start();
//一定要有exec()
this->exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值