QT(二):Qt相关控件的使用和设置,Qt对话框的使用,画图事件的创建和设置,线程和锁的创建利用,网络编程,TCP和UDP客户端及服务器的创建,SQLITE数据库,QTableWidget控件的使用
一、相关控件及操作配置1、QPushButton QtoolButton按钮setText(QString) ---- 设置按钮上的内容setFixedSize(int w, int h) --- 设置固定大小setFixedHeight(int) --- 设置固定高度setFixedwidth(int) --- 设置固定宽度setMaximumSize(int w, int h); ---- 设置最大宽高setMinimumSize(int w, int h); ---- 设置最小宽高setFont(QFont) ---- 设置字体setIcon(QIcon) --- 设置图标setIconSize(QSize) --- 设置图标大小setFlat(bool) --- 设置是否透明setEnabled(bool) --- 设置是否可用toolButton-setToolButtonStyle(Qt::ToolButtonTextBesideIcon)signals:clicked() --- 点击信号pressed() --- 按下信号released() --- 松开信号2、QLabel 标签setText(QString); --- 设置内容setPixmap(QPixmap); --- 显示图片setAlignment(); --- 设置对齐方式setScaledContents(bool) --- 设置自适应添加资源右键headers添加新文件 -- Qt Resource fileQt 资源文件 --- location(资源存放位置)--- 添加前缀 --添加文件打开资源右键资源选择open in editor3、布局QHBoxLayout ---- 水平布局addWidget(QWidget *) --- 添加控件addLayout(QLayout *) --- 添加布局QVBoxLayout ---- 垂直布局addWidget(QWidget *) --- 添加控件addLayout(QLayout *) --- 添加布局QGridLayout ---- 网格布局addWidget(QWidget *, 第几行 第几列 占几行 占几列) //行/列是0 base的4 、QLineEdit行编辑框QString text() ---- 获取行编辑器的内容setText(QString) --- 设置内容setReadOnly(bool) --- 设置是否只读setAlignment(Qt::AlignRight) --- 设置对齐方式setEchoMode(); --- 设置显示模式5 、QTextEdit文本编辑器QString toHtml(); --- 获取带格式的文本QString toPlainText(); --- 获取纯文本setText(QString); --- 设置内容6、 QRadioButton单选按钮signals:clicked()7 、QGroupBox分组框setTitle -- 设置标题setLayout --- 添加布局8、QCheckBox复选框signals:clicked()bool isChecked() --- 获取是否被勾选9、QComBoBox下拉列表addItem(QString) --- 添加条目addItems(QStringList) --- 添加一堆条目signals:currentIndexChanged(int) --- 当index改变时触发currentIndexChanged(QString)10、 QStackWidget堆叠窗口addWidget() --- 添加子页面setCurrentIndex(int) --- 翻到该页面int currentIndex() --- 获取当前页面count() --- 获取总页面数11、QSpinBox12、QDoubleSpinBox数字设定框setValue(double) --- 设置值double value() --- 获取值setRange(double min, double max) --- 设置范围setSingleStep(double) --- 设置步长setPrefix(QString) --- 设置前缀setSuffix(QString) --- 设置后缀setDecimal(int) --- 设置精度小数位数signals:valueChanged(int); valueChanged(QString) ; //QSpinBoxvalueChanged(double); valueChanged(QString) ; //QDoubleSpinBox13、 QSlider 滑动条setValue(int) //设置特定的值int value() //获取当前值setRange(int, int); //设置范围setOrientation(Qt::Horizontal) --- 水平放置 Vertical --- 垂直的signals:valueChanged(int) ;14、 QScrollBar滚动条setValue(50);setRange(0, 100);setOrientation(Qt::Horizontal);signals:valueChanged(int) ;15、 QProgressBar进度条setValue(int)setRange(int, int);16、 QTimer: 定时器start(int msec); --- 启动定时器设置超时时间单位:毫秒stop(); --- 停止定时器signals:timeout(); --- 超时信号二、对话框StandardDialog:1、模态对话框:QDialog dialog(this);dialog.resize(300, 200);//当使用QDialog::exec()成员函数的时候,弹出的对话框是模态对话框,会阻止用户的输入,直到用户关闭它dialog.exec();2、非模态对话框:QDialog *dialog new QDialog(this);//设置属性,当用户关闭该对话框的时候在删除整个对象dialog-setAttribute(Qt::WA_DeleteOnClose);dialog-resize(300, 200);//当使用QDialog::show()成员函数的时候,弹出的对话框是非模态对话框,不会阻止用户的输入dialog-show();3、QFileDialog: 文件对话框静态函数getOpenFileName();getOpenFileNames();getExistingDirectory();QString fileName QFileDialog::getOpenFileName(this, 打开文件, ., 文本文件 (*.h *.cpp *.txt));QStringList fileNames QFileDialog::getOpenFileNames(this, 打开文件, ., 文本文件 (*.h *.cpp *.txt));4、QMessageBox: 消息框静态函数question();warning();information();about();aboutQt();QMessageBox msgBox;msgBox.setText(请确保您的数据准确.);msgBox.setInformativeText(确定要提交您的个人信息吗?);msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);msgBox.setDefaultButton(QMessageBox::Yes);int ret msgBox.exec();switch (ret){case QMessageBox::Yes:this-close();break;default:break;}5、 QInputDialog: 输入对话框QInputDialog::getDoubleQInputDialog::getText();QInputDialog::getInt();double num QInputDialog::getDouble(this, 获得一个浮点数, 请输入一个浮点数:, 100, 0, 100, 5)6、QErrorMessage: 错误对话框QErrorMessage *errMsg QErrorMessage::qtHandler();//errMsg-setAttribute(Qt::WA_DeleteOnClose);errMsg-showMessage(this is a system error);errMsg-showMessage(this is a array overflow error);errMsg-showMessage(this is a system error);errMsg-showMessage(this is a array overflow error);7、QFontDialog: 字体对话框QFontDialog::getFont();static QFont originaIFont ui-textEdit-font();//获取初始字体bool isOk;QFont font QFontDialog::getFont(isOk, this);if (isOk){te-textEdit-setFont(font);}else{te-textEdit-setFont(originalFont);}8、QColorDialog: 颜色对话框QColorDialog::getColor();QColor color QColorDialog::getColor();三、QMainWindow设置QMenuBar菜单栏QMenu: 菜单QAction: 动作QToolBar: 工具栏QStatusBar: 状态栏setWindowTitle(主窗口);//: 前缀 文件名setWindowIcon(QIcon(:/mw_images/10.png));resize(640, 480);//一个主窗口只能有一个菜单栏QMenuBar *menuBar this-menuBar();//可以增加多个菜单//QMenu *fileMenu menuBar-addMenu(QIcon(:/mw_images/file.png), 文件);QMenu *fileMenu menuBar-addMenu(文件);QMenu *editMenu menuBar-addMenu(编辑);QMenu *setMenu menuBar-addMenu(设置);//一个菜单可以增加多个菜单项openAct fileMenu-addAction(QIcon(:/mw_images/open.png), 打开文件);fileMenu-addSeparator();closeAct fileMenu-addAction(QIcon(:/mw_images/close.png), 关闭文件);//增加工具栏,一个主窗口可以有多个工具栏QToolBar *fileTool this-addToolBar(文件);fileTool-addAction(openAct);fileTool-addAction(closeAct);fileTool-setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);fileTool-setFloatable(true);fileTool-setMovable(true);//每个工具栏可以有多个工具项QToolBar *editTool this-addToolBar(编辑);editTool-addAction(copyAct);editTool-addAction(pasteAct);QToolBar *setTool this-addToolBar(设置);setTool-addAction(fontAct);setTool-addAction(colorAct);//一个主窗口可以有多个滑动窗口QDockWidget *dw1 new QDockWidget(滑动窗口);dw1-setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//设置dw1成为一个独立的窗口dw1-setFloating(false);//增加一个滑动窗口addDockWidget(Qt::LeftDockWidgetArea, dw1);//一个主窗口只能有一个中央部件te new QTextEdit;te-setFixedSize(640, 480);setCentralWidget(te);//一个主窗口只能有一个状态栏QStatusBar *statBar this-statusBar();lb_status new QLabel;lb_status-setText(xxx file is editing... );prog_bar new QProgressBar;prog_bar-setValue(67);statBar-addWidget(lb_status);statBar-addWidget(prog_bar);四、事件//事件处理的统一的入口bool event(QEvent *event);//特定事件处理器void mousePressEvent(QMouseEvent *e); --- 鼠标按下事件e-button(); --- 获取鼠标按键Qt::LeftButton(); --- 左键Qt::RightButton(); --- 右键e-pos(); --- 获取该界面鼠标坐标e-x(); --- 获取该界面鼠标的x坐标e-y();e-globalPos(); --- 获取全局界面(屏幕)鼠标坐标e-globalX();e-globalY();void mouseReleaseEvent(QMouseEvent *e); --- 鼠标松开事件void mouseMoveEvent(QMouseEvent *e); --- 鼠标移动事件void mouseDoubleClickEvent(QMouseEvent *e); --- 鼠标双击事件void wheelEvent(QWheelEvent *e); --- 滚轮事件e-angleDelta();e-delta(); --- 获取滚轮增量void keyPressEvent(QKeyEvent *e); --- 按键按下事件e-key(); --- 获取按键Qt::Key_AQt::Key_0Qt::Key_Up;Qt::Key_Return/Qt::Key_Entervoid keyReleaseEvent(QkeyEvent *e); --- 按键松开事件void timerEvent(QTimerEvent *e); --- 定时器时间startTimer(int ms);void Widget::paintEvent(QPaintEvent *event) //绘图事件事件过滤器1) 安装事件过滤器le-installEventFilter(this); //从QObject继承出来的对象可以注册一个事件过滤器所有的事件先交给事件过滤器处理2) 重写事件过滤器/*参数watched: 对象event: 事件返回值true: 事件已处理false: 事件未处理*/bool Widget::eventFilter(QObject *watched, QEvent *event){if (event-type() QEvent::KeyPress){//通过watched判断是否是关注的对象产生了事件//通过event判断是否是关注的事件产生了//如果是想要关注的对象产生了想要关注的事件则进行处理处理完毕返回trueQKeyEvent *keyEvent static_castQKeyEvent *(event);if (keyEvent-key() Qt::Key_0 keyEvent-key() Qt::Key_9){qDebug() (char)(keyEvent-key());QString tmp ui-te2-toPlainText();tmp QString(QChar(keyEvent-key()));ui-te2-setText(tmp);return true;//返回true意味这事件处理完毕,这个事件不会再继续处理}}//对于不关心的事件,记得最后要调用基类的事件处理函数,维持原本的行为//让基类按照常规处理,一定要加上return QWidget::eventFilter(watched, event);}五、绘图void Widget::timerEvent(QTimerEvent *event)void Widget::paintEvent(QPaintEvent *event);update() --- 手动刷新界面重绘触发paintEvent事件,可以配合定时器事件timerEvent一起使用画家事件画笔画刷QPainter //画家QPen //笔QBrush //刷子QPainter p(this);//set this 表示设置主窗口为画布QPen pen(QColor(0, 0, 255));pen.setWidth(3);pen.setStyle(Qt::DashLine);p.setPen(pen); //设置画笔QBrush brush(QColor(255, 0, 0));brush.setStyle(Qt::Dense3Pattern);p.setBrush(brush); //设置画刷p.drawLine(0, 0, 100, 100);//画线p.drawRect(100, 100, 200, 100); //画矩形p.drawEllipse(QPoint(300, 300), 100, 50); //画椭圆p.drawEllipse(QPoint(450, 300), 100, 100); //画圆p.drawPixmap(xPos*50, 400, QPixmap(:/pic/luffy.png)); //画图片p.translate(width()/2, height()/2); //将画家的坐标系的原点移动到主窗口的中心点位置p.drawEllipse(QPoint(0, 0), 150, 150);p.save(); //保存当前的画家的坐标系//画秒针p.rotate(6); //将画家的坐标系顺时针旋转6°p.drawLine(QPoint(0, 0), QPoint(0, -100));p.restore(); //恢复之前保存的画家的坐标系文件操作文件类 QFileQFile file(filename);file.exists()file.setFileName(filename1);file.fileName()file.bytesAvailable()file.size()file.copy(2.txt)file1.errorString()bool file.open(); --- 打开文件QIODevice::ReadOnlyQIODevice::WriteOnlyQIODevice::ReadWriteQIODevice::TrancateQIODevice::Textfile.atEnd(); ---判断是否到达文件末尾file.read(); --- 按字节读取文件内容file.readLine(); --- 读取一行file.readAll(); --- 读取所有内容file.write(); --- 写入内容file.close(); --- 关闭文件线程和锁QThread QMutex//继承QThread类重写run方法start() --- 启动线程terminate() --- 终止线程QMutex: 互斥锁lock(); --- 加锁unlock(); --- 解锁QMutex mutex;//要使用QThread,一般可以新建自己的类,继承与QThreadMyThread::MyThread(QObject *parent) : QThread(parent){}//重写QThread的run()函数,线程要做的事情就是在run()函数里处理void MyThread::run(){while(1){mutex.lock(); //进入临界区前,加锁for (int i 0; i 10; i){std::cout intArray[i] ;}std::cout std::endl;mutex.unlock();//退出临界区,解锁,确定同时只有一个线程处理公共资源}}六、网络编程UPD/TCP网络编程qmake: QT network一、UDP连接UDP: QUdpSocket##UDP客户端//创建套接字socket new QUdpSocket(this);//连接数据到达信号和槽函数//QUdpSocket::readyReadconnect(socket, QUdpSocket::readyRead, this, Widget::data_ready_handler);//当前存在没有处理数据包while (socket-hasPendingDatagrams()){QByteArray datagram;//根据数据报的大小调节接收的字节数组的大小datagram.resize(socket-pendingDatagramSize());//接收套接字的数据到字节数组socket-readDatagram(datagram.data(), datagram.size());//将内容追加到接收区的文本编辑框中ui-te_receive-append(QString::fromLocal8Bit(datagram));}//发送数据报到服务器端,指定服务器的IP地址和端口if (socket-writeDatagram(ui-te_send-toPlainText().toLocal8Bit(), QHostAddress(ip), port.toUShort()) -1){qDebug() 发送数据失败;}else{qDebug() 发送数据成功;}##UDP服务器端//创建服务器的套接字socket new QUdpSocket(this);//服务器绑定IP地址和端口, 唯一的服务器比客户端多的一个步骤socket-bind(QHostAddress::AnyIPv4, 8888);//发送数据报到客户端if (socket-writeDatagram(ui-te_send-toPlainText().toLocal8Bit(), ip, port) -1){qDebug() 发送数据失败;}else{qDebug() 发送数据成功;}//读取数据报的数据,同时获取客户端的IP地址和指针,方便发送回数据给客户端socket-readDatagram(datagram.data(), datagram.size(), ip, port);二、TCP连接TCP: QTcpServer | QTcpSocket##TCP客户端socket new QTcpSocket(this);//连接成功信号connect(socket, QTcpSocket::connected, [](){ui-pb_connect-setText(断开连接);ui-pb_send-setEnabled(true);});//连接断连信号connect(socket, QTcpSocket::disconnected, [](){ui-pb_connect-setText(连接);ui-pb_send-setEnabled(false);});//数据就绪信号connect(socket, QTcpSocket::readyRead, [](){QByteArray data socket-readAll();//QString tmp ui-te_receive-toPlainText();ui-te_receive-append(QString::fromLocal8Bit(data));});//连接到服务器,使用服务器的IP地址和端口socket-connectToHost(QHostAddress(ip), port.toUShort());//发送数据到服务器if (socket-write(ui-te_send-toPlainText().toLocal8Bit()) -1) //使用toLocal8Bit可以支持中文{qDebug() 客户端发送数据失败;}else{qDebug() 客户端发送数据成功;}//发送数据到服务器QByteArray data socket-readAll();ui-te_receive-append(QString::fromLocal8Bit(data)); //使用fromLocal8Bit可以支持中文##TCP服务器端//创建TCP服务器对象server new QTcpServer(this);//设置监听的IP地址和端口server-listen(QHostAddress::AnyIPv4, 8888);//新连接信号connect(server, QTcpServer::newConnection, [](){if (server-hasPendingConnections())//如果有待处理的新连接{socket server-nextPendingConnection();//处理新连接, 获得通信套接字,以后双方的通信基于此套接字,每个新连接会产生一个新的通信套接字}//断连的信号connect(socket, QTcpSocket::disconnected, [](){ui-pb_send-setEnabled(false);});//接收数据就绪信号connect(socket, QTcpSocket::readyRead, [](){//读取接收到的数据QByteArray data socket-readAll();ui-te_receive-append(QString::fromLocal8Bit(data));});});//发送数据到客户端if (socket-write(ui-te_send-toPlainText().toLocal8Bit()) -1){qDebug() 服务器发送数据失败;}else{qDebug() 服务器发送数据成功;}七、SQLITE数据库SQLITE 数据库编程qmake: QT sql使用到的类:QSqlDatabase //数据库连接QSqlQuery //数据SQL语句执行//创建SQLITE数据库连接//不指定数据库连接的名字, 数据库连接缺省的名字为 qt_sql_default_connectionQSqlDatabase db_student QSqlDatabase::addDatabase(QSQLITE);//使用SQLITE数据库, 数据库连接缺省的名字为 qt_sql_default_connection//指定数据库连接的名字为my_db_connectionQSqlDatabase db_student QSqlDatabase::addDatabase(QSQLITE, my_db_connection);//使用SQLITE数据库, 指定数据库连接的名字为my_db_connection//设置数据库的文件名db_student.setDatabaseName(db_file_name);//打开数据库if (!db_student.open()){qDebug() 打开数据库失败1;}//关闭数据库db_student.close();//使用当前的数据库连接 执行SQL操作QSqlQuery query(db_student); //指定一个数据库的连接QSqlQuery query; //不指定数据库连接, 它会使用缺省的数据库连接 qt_sql_default_connection//创建表QString queryStr create table Student (id varchar(64) PRIMARY KEY, name varchar(64), gender varchar(64), age int);if (!query.exec(queryStr)){qDebug() 创建数据库表失败;qDebug() query.lastError().text();}//数据插入//数据插入方式1queryStr insert into Student values(2309250001, 张三, 男, 13);if (!query.exec(queryStr)){qDebug() 插入数据失败;qDebug() query.lastError().text();}//数据插入方式2queryStr insert into Student values(?,?,?,?);query.prepare(queryStr);query.addBindValue(2309250002);query.addBindValue(李四);query.addBindValue(男);query.addBindValue(12);if (!query.exec()){qDebug() 插入数据失败2;qDebug() query.lastError().text();}//数据插入方式3QString queryStr insert into Student values(:id,:name,:gender,:age);query.prepare(queryStr);query.bindValue(:id, ui-le_id-text());query.bindValue(:name, ui-le_name-text());query.bindValue(:gender, ui-cbb_gender-currentText());query.bindValue(:age, ui-le_age-text().toInt());if (!query.exec()){qDebug() execute queryStr failed;qDebug() query.lastError().text();}//查询数据QString queryStr select * from Student;if (!query.exec(queryStr)){qDebug() execute queryStr failed;qDebug() query.lastError().text();}QString queryStr select * from Student where id :id;query.prepare(queryStr);query.bindValue(:id, ui-le_id-text());if (!query.exec()){qDebug() execute queryStr failed;qDebug() query.lastError().text();}while (query.next()){ui-le_name-setText(query.value(1).toString());ui-cbb_gender-setCurrentText(query.value(2).toString());ui-le_age-setText(query.value(3).toString());}//修改数据QString queryStr update Student set name?, gender?,age? where id?;query.prepare(queryStr);query.addBindValue(ui-le_name-text());query.addBindValue(ui-cbb_gender-currentText());query.addBindValue(ui-le_age-text());query.addBindValue(ui-le_id-text());if (!query.exec()){qDebug() execute queryStr failed;qDebug() query.lastError().text();}//删除数据QString queryStr delete from Student where id :id;query.prepare(queryStr);query.bindValue(:id, ui-le_id-text());if (!query.exec()){qDebug() execute queryStr failed;qDebug() query.lastError().text();}八、 QTableWidget控件//设置显示为4列ui-tableWidget-setColumnCount(4);QStringList list;list 学号 姓名 性别 年龄;ui-tableWidget-setHorizontalHeaderLabels(list);//根据数据库的记录的条数来设置行数ui-tableWidget-setRowCount(lists.size());//设置tableWidget的某一项ui-tableWidget-setItem(i, j, (new QTableWidgetItem(lists.at(i).at(j))));//获得某一项QTableWidgetItem *item ui-tableWidget-item(i, 0);//获得行数int row ui-tableWidget-rowCount();//插入1行, 0 baseui-tableWidget-insertRow(row);//获得某一项的数据ui-tableWidget-item(row, count)-data(0).toString();ui-tableWidget-item(row, count)-data(0).toInt();//获得当前选中的行 0 baseui-tableWidget-currentRow();//设置id不能被用户编辑QTableWidgetItem *item ui-tableWidget-item(i, 0);item-setFlags(item-flags() (~Qt::ItemIsEditable));
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420005.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!