QT中常用类

4 篇文章 0 订阅

目录

1、TableWidget类

 1.1、均分各列

1.2、整行选中:

1.3、删除选中的整行

1.4、删除表格旁边的行号

1.5、 行、列操作

1.6、设置编辑属性

1.8.修改某行数据触发信号与槽函数

1.9获取当前最大行数

2、对话框类

2.1、建立标准输入对话框:

2.2、消息提示框

2.3、打开文件对话框及QProcess类的运用

3、radiobutton类

4、QComboBox类

5、QLable类:

6、QDateTimeEdit类:

7、QTesxtEdit类:

8、QLineEdit类:

9、datetime类

10、QTimer(定时器的运用)

11、信号与槽

11.1、QTabWidget常用信号

12、Qt线程类

12.1、Qt线程类创建实例与socket的联合运用

12.2、多线程与UI类的运用

12.3、Qt线程常用的方法

13、菜单栏的运用

14、读写操作

14.1、将QPainTextEdit中的内容写入到本地文件

15、QDDesigner操作


1、TableWidget类

 1.1、均分各列

 tableWidget->horizontalHeader()->setStretchLastSection(true); //就是这个地方
 tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);


1.2、整行选中:
 

tableWidget->setSelectionBehavior ( QAbstractItemView::SelectRows); //设置选择行为,以行为单位
tableWidget->setSelectionMode ( QAbstractItemView::SingleSelection); //设置选择模式,选择单行


1.3、删除选中的整行

int rowIndex = m_pAttrbuteList->currentRow();
 if (rowIndex != -1)
     tableWidget->removeRow(rowIndex);

为了将数据能够在界面中显示的更清楚一些,在这里应用到了tableWidget控件,现将该控件中删除指定行的代码介绍如下:

QTable里有一个removeRow(int i)函数用来删除当前行,但是如果我们没有对于table进行任何的选中,那么QTable是如何返回的呢?
 用Qt Creator里拖了一个tableWidget,加一个按钮,点击删除后执行

 int i = ui->tableWidget->currentRow();
 QMessageBox msg;
 msg.setText(QString::number(i));
 msg.exec();
 ui->tableWidget->removeRow(i);


 住:在不选择行的情况下发现每次点击后删除的都是第一行,i的输出都是0.原因其实很简单,就是因为table的当前焦点在第一样的第一个单元格所导致的,解决的办法就是让table失去焦点,在构造函数里面添加ui->tableWidget->setFocusPolicy(Qt::NoFocus);
然后再试,发现点击删除按钮如果不选中行的话是不能删除的,返回的i此时是-1。
控件刚开始的时候左边默认自带序列号,如果想去掉左边的行号,加上下面的代码就可以了。

1.4、删除表格旁边的行号

QHeaderView* headerView = table的名字->verticalHeader();
      headerView->setHidden(true);



1.5、 行、列操作

int rowIndex = m_pAttrbuteList->rowCount();
 tableWidget->setRowCount(rowIndex + 1);//总行数增加1

 tableWidget->setRowHeight(rowIndex, 24);//设置行的高度

ui.test_table->setColumnWidth(0, 200);//设置列宽

QTableWidget *table = new QTableWIdget(this);
table->setColumnCount(5);    //设置列数
table->setRowCount(3);        //设置行数/

/*设置列名*/
QStringList headers;
headers<<"列名1"<<"列名2"<<"列名3";
table->setHorizontalHeaderLabels(headers);


/*给单元格添加内容*/
void addItemContent(int row, int column, QString content)
{
      QTableWidgetItem *item = new QTableWidgetItem (content);
      table->setItem(row, column, item);

}


/*给单元格中增加图标*/
QTableWidgetItem *item = new QTableWidgetItem(QIcon("myImage.jpg"), NULL);  //只加入图标,没有字符串
QTableWidgetItem *item = new QTableWidgetItem(QIcon("myImage.jpg"), myString);   //加入图标和字符串
table->setItem(row, column, item);

/*插入一行*/
int row = table->rowCount();
table->insertRow(row);

/*插入一列*/
int column = table->columnCount();
table->insertColumn(column);

 //使行列头自适应宽度,最后一列将会填充空白部分
table->horizontalHeader()->setStretchLastSection(true);          

//使行列头自适应宽度,所有列平均分来填充空白部分            
table->horizontalHeader()->setResizeMode(QHeaderView::Strtch);       

//使行自适应高度,假如行很多的话,行的高度不会一直减小,当达到一定值时会自动生成一个QScrollBar
table->verticalHeader()->setResizeMode(QHeaderView::Strtch);

//设置单击选择一行
table->setSelectionBehuavior(QAbstractItemView::SelectRows);

//设置列的宽度
table->setColumnWidth(cloumn, cloumn_width);

// 选中行颜色
ui->tableWidget->setStyleSheet("selection-background-color: red");
// 行背景色 
ui->tableWidget->setStyleSheet("QTableView::Item{background-color:#FF3EFF}");

//设置摸个单元格颜色
item->setBackground(QBrush(QColor(255, 0, 0)));


1.6、设置编辑属性

//设置每行内容不可编辑
table->setEditTriggers(QAbstractItemView::NoEditTriggers);


参数设置:
QTableWidget.NoEditTriggers 0 No editing possible. 不能对表格内容进行修改 
QTableWidget.CurrentChanged 1 Editing start whenever current item changes.任何时候都能对单元格修改 
QTableWidget.DoubleClicked 2 Editing starts when an item is double clicked.双击单元格 
QTableWidget.SelectedClicked 4 Editing starts when clicking on an already selected item.单击已选中的内容 
QTableWidget.EditKeyPressed 8 Editing starts when the platform edit key has been pressed over an item. 
QTableWidget.AnyKeyPressed 16 Editing starts when any key is pressed over an item.按下任意键就能修改 
QTableWidget.AllEditTriggers 31 Editing starts for all above actions.以上条件全包括
 

//设置只能选择一行,不能选择多行
table->setSelectionMode(QAbstractItemView::SingleSelection);

/*设置让某个单元格行选中行为*/
//选中单元格:
table->setCurrentCell(row, column, QItemSelectionModel::Select);
//选中一行
table->setCurrentCell(row, QItemSelectionModel::Select);(注意此处的列没有值)

注:以下使用的为python语法
1.7获取指定行数的某个数据:

print(self.Order_table.item(del_row,0).text())

1.8.修改某行数据触发信号与槽函数

//pyqt5
self.Order_table.itemChanged.connect(self.itemChanged_Print)
//tableWidget的cellChanged信号,可以知道那个单元格被编辑了  C++
connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(。。。));

1.9获取当前最大行数

print(self.Order_Table.rowCount())


2、对话框类


2.1、建立标准输入对话框:

//pyqt中的用的法
ok2 = QInputDialog.getText(self,"Platelet type distribution ","Please enter the platelet type distribution")//第四个参数(设置输入框的显示):QLineEdit.Password 
ifok0:
    self.inputL = QLineEdit()
    self.inputL.setText(Item_row0)
    newItem = QTableWidgetItem(Item_row0)
    self.Order_table.setItem(0,0,newItem)


//C++的用法
//输入对话框用于接收用户的输入,如我们要接收用户输入一个字符串,可以使用:QInputDialog::getText():

bool ok;
QString text = QInputDialog::getText(this, tr("Input You Name"),
		tr("User name:"), QLineEdit::Password/*QLineEdit::NoEcho*/,
		"Mr Zhang", &ok);
if (ok && !text.isEmpty())
		QMessageBox::information(NULL,"notice",text);
/*参数:

1、父组件指针;

2、对话框的标题;

3、指导用户输入的提示语句;

4、对话框的输入模式;

5、输入框中的默认字符串;

6、接收返回值,用户按下ok,返回true,用户按下cancel,返回false。*/
--------------------- 

2.2、消息提示框

//QMessageBox::Information 消息图标
//QMessageBox::Warning 警告消息
//QMessageBox::Critical 严重

//直接使用匿名对象
int r = QMessageBox::information(this, tr("提示"),tr("数值超出范围,是否保存修改?"), QObject::tr(("确认")) , QObject::tr(("取消")));
if (r == QObject::tr(("确认")).toInt()) 
{
    writePara(GlobalVariables::selectWindow);
    this->close();
}

//如果想自定义消息框显示自定义图片
QMessageBox message(QMessageBox::NoIcon, "Title", "Content with icon."); 
 message.setIconPixmap(QPixmap("icon.png")); 
 message.exec();

2.3、打开文件对话框及QProcess类的运用

//建立打开文件对话框对象
QFileDialog open_test_item;
QString test_item_path = open_test_item.getOpenFileName(this, "打开文件", "D:/w_x_me/Qt/car-camera", "All Files (*.doc);", 0);
qDebug() << test_item_path << endl;
//建立启动.exe程序对象
QProcess *myProcess = new QProcess(this);
myProcess->start(QString("C:/Program Files/Microsoft Office/Office15/WINWORD.EXE"), QStringList(test_item_path));
myProcess->waitForFinished();//等待调用程序关闭


3、radiobutton类

 ischecked()//判断数据是否选中   

4、QComboBox类

currentText() //获取当前文本的值

5、QLable类:

加载图片
png=QPixmap('D:/codeWorkSpace/Edgin_machine/1.jpg').scaled(self.Pic_Val.width(),self.Pic_Val.height())
self.Pic_Val.setPixmap(png)
QLabel控件加载图片自适应变化,设置图片大小适应QLabel大小
self.Pic_Val.setScaledContents(True)
self.Pic_Val.resize(self.Pic_Val.size())
//设置窗口为固定大小
Edit_Order_UI.setFixedSize(1200, 800)

//设置Label大小适应图片大小,先设置Label,再将图片画上去
ui->Pic_Val->resize(png->width(),png->height());
ui->Pic_Val->setPixmap(png)

//QImage图片在QLabel上显示,先转换成QPixmap,
//QImage battery_deal->img
ui.Image_show2->setPixmap(QPixmap::fromImage(battery_deal->img).scaled(ui.Image_Show1->width(), ui.Image_Show1->height()));

6、QDateTimeEdit类:

self.EndTime.setDisplayFormat("yyyy-MM-dd HH:mm:ss")

7、QTesxtEdit类:

按行追加数据:
self.textEdit.append(str)
向当前行插入数据:
self.textEdit.insertPlainText(arr.get(a))


8、QLineEdit类:

禁止编辑:
self.add_order.CQ_Edit.setEnabled(False)

9、datetime类

方法1:
获取系统时间:(引入datetime模块)
datetime.now()
//头文件:#include<time.h>
//获取系统时间,并且按格式显示
QString Battery::Get_Time()
{
	QDateTime current_date_time = QDateTime::currentDateTime();
	QString current_date = current_date_time.toString("yyyy/MM/dd hh:mm:ss.zzz ddd");//修改字符串可以控制其显示格式。年/月/日 时:分:秒.毫秒 星期
	return current_date;
}

10、QTimer(定时器的运用)

int Timer;
Timer = startTimer(2000);//获取定时器ID,并且设置定时器触发时间

//绑定为按钮的槽函数
void Timer_Example::Start()
{
	Timer = startTimer(2000);
	ui.Start_btn->setEnabled(false);
}
//重新定时器触发时间
void Timer_Example::timerEvent(QTimerEvent*)
{
	Image_Show();
}

//调用Image_Show,点击按钮后,可以让一个Label显示多张图片
void Timer_Example::Image_Show()
{
	if (index == 0)
	{
		ui.Image_Show_label->setPixmap(QPixmap("1.bmp").scaled(ui.Image_Show_label->width(), ui.Image_Show_label->height()));
	}
	if (index == 1)
	{
		ui.Image_Show_label->setPixmap(QPixmap("2.bmp").scaled(ui.Image_Show_label->width(), ui.Image_Show_label->height()));
	}
	if (index == 2)
	{
		ui.Image_Show_label->setPixmap(QPixmap("3.bmp").scaled(ui.Image_Show_label->width(), ui.Image_Show_label->height()));
	}
	if (index == 3)
	{
		ui.Image_Show_label->setPixmap(QPixmap("4.bmp").scaled(ui.Image_Show_label->width(), ui.Image_Show_label->height()));
	}
	if (index == 4)
	{
		ui.Image_Show_label->setPixmap(QPixmap("5.bmp").scaled(ui.Image_Show_label->width(), ui.Image_Show_label->height()));
	}
	if (index == 5)
	{
		ui.Image_Show_label->setPixmap(QPixmap("6.bmp").scaled(ui.Image_Show_label->width(), ui.Image_Show_label->height()));
	}
	if (index == 6)
	{
		ui.Image_Show_label->setPixmap(QPixmap("7.bmp").scaled(ui.Image_Show_label->width(), ui.Image_Show_label->height()));
	}
	index += 1;
	if (index == 7)
	{
		if (Timer != -1)
		{
			killTimer(Timer);
			Timer = -1;
		}
		index = 0;
		ui.Start_btn->setEnabled(true);
	}
}

11、信号与槽

//自定义信号
signals:
	void ho_Image_show_signal(int a);
	void init_windows_signal(QString str);
	void circle_Image_show_signal(int b, QString bstr);

//自定义槽函数
private slots:
	void ho_Image_show(int a);
	void init_windows(QString str);
	void circle_Image_show(int b , QString bstr);

//绑定信号与槽函数,参数详解:参数1:信号发送者,参数2:发送的信号,参数3:信号接收者,参数4:连接的槽函数。注:参数5不常用。
connect(this, SIGNAL(ho_Image_show_signal(int)), this, SLOT(ho_Image_show(int)),Qt::DirectConnection);
connect(this, SIGNAL(init_windows_signal(QString)), this, SLOT(init_windows(QString)));
connect(this, SIGNAL(circle_Image_show_signal(int, QString)), this,SLOT(circle_Image_show(int, QString)));

//获取信号发送者的名称
qDebug()<<QObject::sender()->objectName();

注: 通过第五个参数,指定槽函数在哪个线程中运行

第五个参数代表槽函数在哪个线程中执行 : 
1)自动连接(AutoConnection),默认的连接方式,如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。 
2)直接连接(DirectConnection),当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行,即槽函数和信号发送者在同一线程 
3)队列连接(QueuedConnection),当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行,即槽函数与信号接受者在同一线程

11.1、QTabWidget常用信号

//QTabWidget类标签页切换型号,currentChanged(int)
connect(ui.tabwidget, SIGNAL(currentChanged(int)), this, SLOT(Tab_Changed(int)));

12、Qt线程类

12.1、Qt线程类创建实例与socket的联合运用

Thread.h

#include<QLabel.h>
#include<qpushbutton.h>
#include<qlineedit.h>
#include<QtNetwork/QtNetwork>
#pragma execution_character_set("utf-8")
class Thread : public QThread
{
	Q_OBJECT
public:
	QLabel *thread_label;
	QPushButton *thread_btn;
	QLineEdit *thread_let;
	QTcpSocket **thread_socket;
	int socket_node;
	bool run_state;
	Thread();
	void setParam(QLabel *label, QPushButton *btn, QLineEdit *let, QTcpSocket **socket,int node);
protected:
	void run();
private:
	int i;
};

Thread.cpp

#include "thread.h"
#include <QDebug>
Thread::Thread()
{
}
//线程需要的参数
void Thread::setParam(QLabel *label, QPushButton *btn, QLineEdit *let, QTcpSocket **socket,int node)
{
	thread_label = label;
	thread_btn = btn;
	thread_let = let;
	thread_socket = socket;
	socket_node = node;

}
//线程实现
void Thread::run()
{

	i = 0;
	qDebug() <<"调用线程编号:"<<socket_node <<"------调用线程ID为:" << QThread::currentThread() << endl;//获取线程ID
	thread_label->setText("启动线程了");
	QString read_cont = (*thread_socket)->readAll();
	while (run_state)
	{
		if ((*thread_socket)->bytesAvailable()>1)
		{
			read_cont = (*thread_socket)->readAll();
			qDebug() << (*thread_socket)->bytesAvailable() << endl;
			qDebug() << read_cont << endl;
			if (read_cont.length() < 20)
			{
				thread_label->setText("收到消息" + read_cont);
				read_cont = "";
			}
			if (read_cont == "close\n")
			{
				//(*thread_socket)->close();
				run_state = false;
			}
		}
	}
	qDebug() << "结束线程" << endl;
}

线程的调用

//定义线程组
Thread thread[10];

//启动其中某个线程
thread[i].setParam(ui.read_10, ui.Send_Bt_10, ui.send_10, &m_socket[i], i);
thread[9].run_state = true;
thread[i].start();
socket_state[i] = 1;

12.2、多线程与UI类的运用

运用子线程调用UI类中的方法。

ui界面类头文件:

battery.h

#pragma once
#ifndef BATTERY_H
#define BATTERY_H
#pragma execution_character_set("utf-8")
#include <QtWidgets/QMainWindow>
......
#include<QString>
#include"AutoWork_Thread.h"
class Battery : public QMainWindow
{
	Q_OBJECT
public:
	Battery(QWidget *parent=0);
	~Battery();
......
	void Auto_Work();
......
protected:	
public slots:
	......
private:
	Ui::BatteryClass ui;
};
#endif // BATTERY_H

ui界面类实现文件:

battery.cpp

#include "battery.h"
#include <QVector>
#include <qmath.h>
#include <QPainter>
#include <QPointF>
#include <QPen>
Battery::Battery(QWidget *parent)
: QMainWindow(parent)
{
	ui.setupUi(this);
	.......
	Auto_Thread* auto_work = new Auto_Thread(this);//将界面类正在运行的对象传入到自定义的线程类中
	auto_work->start();//启动线程
}
......
void Battery::Auto_Work()
{
	.......	
}

Battery::~Battery()
{
}
Auto_Thread::Auto_Thread(Battery* pwindow)
{
	m_pWindow = pwindow;
}
void Auto_Thread::run()//定义线程方法
{
	//m_pWindow->Auto_Work();//调用UI类方法
    //通过线程直接操作UI的成员变量
	m_pWindow->image_deal->SetParam(PLC);
	......
	2、进入自动作业过程
	//3、启动电池处理线程
	while (true)
	{
		m_pWindow->image_deal->start();
		.....
	}
}

线程类的头文件:AutoWork_Thread.h

#pragma once
#pragma execution_character_set("utf-8")
#include<QThread>
#include <QtWidgets/QMainWindow>
class Battery;
class Auto_Thread : public QThread
{
	Q_OBJECT;
public:
	Battery *m_pWindow;
	Auto_Thread(Battery* pwindow);
	void run();
	
};

注:AutoWork_Thread不能单独使用#include"battery.h"头文件,必须声明class Battery,否则会报语法错误。不使用#include"battery.h"头文件,Auto_Thread的方法就必须在battery.cpp中实现。使用头文件后,可以在另外的文件中实现。

12.3、Qt线程常用的方法

线程启动:start()运行一次

线程终止:terminate 终止线程,强制终止线程但会依据操作系统的调度策略,可能不是立即终止,最好用wait等待
quit退出线程,也可以调用exit,效果相同,会正常终止线程。

线程状态查询:isRunning是否正在运行,isFinished是否运行完成

线程状态信号:started线程启动时发出,finished线程结束时发出

其他:wait阻塞方式等待线程结束,调用此函数会将调用指令所在函数阻塞

参考文献:https://www.cnblogs.com/techiel/p/8013018.html

13、菜单栏的运用

13.1、在菜单栏添加动作与绑定槽函数

 QAction *act = new QAction(tmp, m_menu);
 act->setCheckable(true);
 act->setChecked(false);
 m_menu->addAction(act);
 connect(act, SIGNAL(triggered()), this, SLOT(checkedAction()))

14、读写操作

14.1、将QPainTextEdit中的内容写入到本地文件

QFile file("D:\\work\\Qt\\HB-Camre-Control\\ControlParam.ini");//文件命名
	if (!file.open(QFile::WriteOnly | QFile::Text))     //检测文件是否打开
	{
		QMessageBox::information(this, "Error Message", "Please Select a Text File!");
		return;
	}
	QTextStream out(&file);                 //分行写入文件
	out << ui.param_Edit->toPlainText();

15、QDDesigner操作

1、鼠标悬浮在某个控件上,出现提示内容

2、页面布局后,各个控件在布局中所占比例

16、QString常用方法

输出中文:QStringLiteral("你好中国")

数据类型转换


 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值