QT中常用类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w_x_myself/article/details/76516502

 

目录

 

TableWidget类

 1.1、均分各列

1.2、整行选中:

1.3、删除选中的整行

1.4、删除表格旁边的行号

1.5、 行、列操作

1.6、设置编辑属性

 

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

1.9获取当前最大行数

2、标准对话框类

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

3、radiobutton类

4、QComboBox类

5、QLable类:

6、QDateTimeEdit类:

7、QTesxtEdit类:

8、QLineEdit类:

9、datetime类


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);//设置行的高度

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);


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.修改某行数据触发信号与槽函数

self.Order_table.itemChanged.connect(self.itemChanged_Print)

1.9获取当前最大行数

print(self.Order_Table.rowCount())


2、标准对话框类


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

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)


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)

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类

获取系统时间:(引入datetime模块)
datetime.now()

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);

//绑定信号与槽函数
connect(this, SIGNAL(ho_Image_show_signal(int)), this, SLOT(ho_Image_show(int)));
	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)));

12、Qt线程类

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;
	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;

猜你喜欢

转载自blog.csdn.net/w_x_myself/article/details/76516502
今日推荐