。
。
#include <QDebug>
#define cout qDebug() << "["<< __FILE__ << ":"<< __LINE__ << "]"
stream >> str >> a;
cout<< str.toUtf8().data() <<a;
。
九 、鼠标事件、滚轮事件、键盘事件、窗口改变事件、进入离开事件
十四、事件过滤器
一 、设置窗口属性
#include "widget.h"
Widget::Widget(QWidget *parent) //窗口大小
: QWidget(parent)
{
this->setWindowTitle("hello qt"); //设置窗口的标题
this->resize(1400,864); //设置窗口的大小 可拉伸
this->setFixedSize(1400,864); //设置串口大小 不可拉伸
}
Widget::~Widget()
{
}
二 、 按钮的创建
创建按钮对象
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget> //所有控件的基类 就是一个窗口
#include<QPushButton>
class Widget : public QWidget //Widget类继承了QWidget类
{
Q_OBJECT //信号处理工具
public:
Widget(QWidget *parent = 0); //构造函数
~Widget();
QPushButton *button_none;
public slots: //自定义槽函数
protected:
};
#endif // WIDGET_H
设置按钮属性
//如果不给按钮指定父对象 那么按钮和窗口单独显示
//若按钮有指定父对象,只要父对象显示 按钮也会显示
//QPushButton button;
button_none = new QPushButton; //不释放会导致内存泄漏
//button = new QPushButton("登录"this) //构造函数时 指定父对象及设置文本
button_none->show();
button_none->setParent(this); //指定按钮的父类是窗口
button_none->resize(100,70); //设置按钮的大小
button_none->move(300,200); //设置在窗口中的位置
button_none->setText("登录"); //设置按钮的文本
三 、信号与槽
1)系统自带的信号与槽
button_close = new QPushButton;
connect(button_close,&QPushButton::clicked,this,&QWidget::close); //设置点击按钮
connect(信号发出对象,发出的信号,接收信号的对象,接收对象的槽函数)
2)自定义槽
class Widget: public QWidget
{
Q_OBJECT
public:
AddressWidget(QWidget *parent = 0);
void readFromFile(const QString &fileName);
public slots:
void showAddEntryDialog();
void addEntry(QString name, QString address);
signals:
void selectionChanged (const QItemSelection &selected);
private:
void setupTabs();
};
void widget::showAddEntryDialog(){
setupTabs();
}
3)自定义信号
class NewAddressTab : public QWidget
{
Q_OBJECT
public:
NewAddressTab(QWidget *parent = 0);
signals:
void showdata(int a);
public slots:
void emitsignal();
private:
QLabel *descriptionLabel;
QPushButton *addButton;
QVBoxLayout *mainLayout;
};
void QWidget::emitsignal(){
emit showdata(10);
}
4)lambda表示
lambda应用
int a=3,b=10
connect(button,&QPushButton::clicked,this,[a,b](){ //槽函数的lambda表示
connect(button,&QPushButton::clicked,this,[=](){ //将所有局部变量以值传递的形式传递,但是不可改变a的值
connect(button,&QPushButton::clicked,this,[=]()mutable{ //可以改变a的值,但仅限于函数内部 外部值未改变
connect(button,&QPushButton::clicked,this,[&a]()mutable{ //引用形式,改变函数内部与外部的值
connect(button,&QPushButton::clicked,this,[&]()mutable{
qDebug()<<a;
qDebug()<<b;
});
四 、菜单栏、工具栏、状态栏、铆接控件、中心控件、资源文件
1)菜单栏、工具栏、状态栏
#include "mainwindow.h"
#include<QMenuBar>
#include<QMenu>
#include<QAction>
#include<QToolBar>
#include<QStatusBar>
#include<QLabel>
#include<QTextEdit>
#include<QDockWidget>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->resize(600,400);
QMenuBar *menubar1 = this->menuBar(); //取出菜单栏
QMenu * filemenu = menubar1 -> addMenu("文件"); //向菜单栏上 添加菜单
QMenu * fileedit = menubar1 -> addMenu("编辑");
QAction *openaction = filemenu->addAction("打开"); //向菜单添加菜单项
filemenu->addSeparator(); //添加分割线
QAction *saveaction = filemenu->addAction("保存");
QToolBar *toolbar = this->addToolBar(""); //获取工具栏
toolbar->addAction(openaction); //向工具栏中 添加工具(添加菜单项) 工具栏是菜单项的快捷方式
toolbar->addAction(saveaction);
QStatusBar *status = this->statusBar(); //取出状态栏
status->addWidget(new QLabel("状态"));
}
MainWindow::~MainWindow()
{
}
4)铆接控件、中心控件
QDockWidget *dockwidget = new QDockWidget("这是一个铆接部件",this);
this->addDockWidget(Qt::TopDockWidgetArea,dockwidget); //讲浮动窗口添加到mainwindow
//核心部件(中心部件)
QTextEdit *edit = new QTextEdit("文本编辑器",this);
this->setCentralWidget(edit);
6)资源文件
五 、对话框
1)标准对话框
button_infor = new QPushButton;
button_infor->setText("消息"); //设置按钮的文本
connect(button_infor,&QPushButton::clicked,this,[&]()
{
//QMessageBox::about(this,"消息对话框","显示内容"); //不引用无法指定父对象
int ret = QMessageBox::question(this,"标题","你需要吗",QMessageBox::Open|QMessageBox::Save);
if(ret == QMessageBox::Open)
{
qDebug()<<"open";
}
});
2)模态对话框
3)飞模态对话框
六 、标签
行编辑超链接、图片、动态图
QLabel_1 = new QLabel(this);
QLabel_1->resize(200,100);
QLabel_1->move(10,300);
//QLabel_1->setText("标签_1");
QLabel_1->setText("<a href=\"http://www.baidu.com\">标签:百度一下</a>");//标签超链接
QLabel_1->setOpenExternalLinks(true);
QLabel_pic = new QLabel(this); //设置标签的图片
QLabel_pic->resize(100,100);
QLabel_pic->move(10,50);
QLabel_pic->setPixmap(QPixmap(":/new/prefix1/Tencent.jpg"));
QLabel_pic->setScaledContents(true); //设置图片自适应大小
//QLabel_2->setPixmap(QPixmap("qrc:/new/prefix1/Tencent.jpg"));
QLabel_gif = new QLabel(this); //设置标签的动态图
QLabel_gif->resize(100,100);
QLabel_gif->move(20,200);
QLabel_gif->setText("标签_333");
//QMovie *gifmove = new QMovie("qrc:/new/prefix1/Tencent.jpg"); //动态图地址
//QLabel_gif->setMovie(gifmove);
//QLabel_gif->setScaledContents(true); //设置图片自适应大小
//gifmove->start();
七 、行编辑
行编辑:内容、显示模式、位置
lineEdit_2 = new QLineEdit(this);
lineEdit_2->setObjectName(QStringLiteral("lineEdit_2"));
lineEdit_2->setGeometry(QRect(210, 170, 120, 71));
lineEdit_2->setText("哈哈qwe");
qDebug()<<lineEdit_2->text();
//设置行编辑的显示模式
//lineEdit_2->setEchoMode(QLineEdit::Password); //显示为密码模式
lineEdit_2->setEchoMode(QLineEdit::PasswordEchoOnEdit); //显示为密码模式
lineEdit_2->setTextMargins(100,0,0,0);//设置输入文本在行编辑中的位置
八、定时器
Pro文件操作
button_time->setText("超时"); //设置按钮的文本
connect(button_time,&QPushButton::clicked,this,&Widget::time); //点击按键开始计时
void Widget::time()
{
qDebug()<<"自定义槽函数";
time_event = new QTimer;
time_event->start(1000);
connect(time_event,&QTimer::timeout,this,[](){
qDebug()<<"00000";
qDebug()<<"超时事件";
});
}
九 、鼠标事件、滚轮事件、键盘事件、窗口改变事件、进入离开事件
void mousePressEvent(QMouseEvent *event); //鼠标点击事件
void mouseMoveEvent(QMouseEvent *event); //鼠标移动事件
void wheelEvent(QWheelEvent *event); //鼠标滚轮事件
void keyPressEvent(QKeyEvent *event);
void resizeEvent(QResizeEvent *event);
void enterEvent(QEvent *event); //鼠标进入事件
void paintEvent(QPaintEvent *event);
void Widget::mousePressEvent(QMouseEvent *event)
{
qDebug()<<"鼠标点击"<<event->x()<<event->y();
i=event->x();
j=event->y();
//刷新绘图
this->update();
if(event->button()==Qt::LeftButton)
{
qDebug()<<"点击左键";
}
else if(event->button()==Qt::RightButton)
{
qDebug()<<"点击右键";
}
}
void Widget::mouseMoveEvent(QMouseEvent *event) //鼠标点击状态下移动事件
{
qDebug()<<"鼠标点击状态下移动"<<event->x()<<event->y();
}
void Widget::wheelEvent(QWheelEvent *event) //滚轮事件判定
{
if(event->orientation()==Qt::Vertical) //如果方向是垂直
{
//QPoint point=e->angleDelta();
// QString str = QString("滚轮垂直华东(%1,%2)");
//.arg(point.x()).arg(point.y());
qDebug()<<"滚轮事件"<<event->x()<<event->y();
}
}
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug()<<event->key();
if(event->modifiers()==Qt::ShiftModifier)
{
qDebug()<<"按下shift";
}
}
十、绘制图形
十一 、自定义事件(滑动条)
十二、TCP/IP通信
1)服务器
Pro文件添加网络属性
QT += core gui network
定义行编辑模式
/********************************************************
获取行编辑内容 QLineEdit
*********************************************************/
lineEdit_recv_area = new QLineEdit(this);
lineEdit_recv_area->setObjectName(QStringLiteral("lineEdit_2"));
lineEdit_recv_area->setGeometry(QRect(70, 35, 400, 70));
lineEdit_recv_area->setText("recv-接收端");
lineEdit_recv_area->setReadOnly(true); // 只读模式
lineEdit_send_area = new QLineEdit(this);
lineEdit_send_area->setObjectName(QStringLiteral("lineEdit_2"));
lineEdit_send_area->setGeometry(QRect(70, 130, 400, 70));
lineEdit_send_area->setText("emit-发射端");
建立链接
tcp_server=NULL; //服务器
tcp_socket=NULL; //客户端
tcp_server = new QTcpServer(this); //监听套接字 指定父对象,让其自动回收空间
tcp_socket = new QTcpSocket(this); //通信套接字
tcp_server->listen(QHostAddress::Any,8888); //监听完毕
connect(tcp_server,QTcpServer::newConnection,[=](){
tcp_socket = tcp_server->nextPendingConnection(); //取出对方主动连接的发出的套接字
QString ip = tcp_socket->peerAddress().toString(); //获取对方的IP和窗口
qint16 port = tcp_socket->peerPort();
QString temp = QString("[%1:%2]:当前连接成功").arg(ip).arg(port);
lineEdit_send_area->setText(temp);
});
发送内容
connect(button_send,&QPushButton::clicked,this,[=](){
if(NULL == tcp_socket)
{
return;
}
QString str = lineEdit_send_area->text(); //获取编辑区内容
tcp_socket->write(str.toUtf8().data()); //给对方发送数据,使用套接字是tcpsocket
qDebug()<<str; //将获取的字符 转换为字符串模式
connect(tcp_socket,&QTcpSocket::readyRead,[=](){
QByteArray array = tcp_socket->readAll(); //从通信套接字中取出内容
lineEdit_recv_area->setText(array);
});
});
断开链接
connect(button_close,&QPushButton::clicked,this,[=](){ //主动与客户端断开连接
if(NULL == tcp_socket)
{
return;
}
tcp_socket->disconnectFromHost();
tcp_socket->close();
tcp_socket=NULL;
});
2)客户端
行编辑+文本编辑区
获取IP和端口 建立链接
十三 、UDP通信过程
UDP = 写信 ,TCP = 打电话
十四 、文件操作
1)读文件
2)写文件
3)获取文件信息
十五 、TCP文件传输
先发head定时20ms,在定时器的槽函数中发送文件,避免连包的情况
十六、多线程操作
QT4.7版本线程处理方式
十七、复选框
十八、单选按钮
十九、列表控件
二十、表格控件
二十一、事件过滤器
1.创建事件过滤器
virtual bool QObject::eventFilter(QObject *watched,QEvent *event) //建立事件过滤器
如果watch对象已安装事件过滤器,则调用该函数 并进行事件过滤
为mainwindow创建事件过滤器,过滤某个组件上的事件。首先判断属于哪个组件,然后判断这个事件的类型。
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*->(event);
qDebug() << "Ate key press" << keyEvent->key();
return true;
}
else {
return false;
}
}
else {
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event);
}
}
2.安装事件过滤器
安装事件过滤器 ,过滤器的组件 优先调用过滤器函数 然后调用事件函数
void QObject::installEventFilter(QObject *filterObj)
二十二、布局
1、List列表
、
(1) List列表 - listwidget.h
#ifndef LISTWIDGET_H
#define LISTWIDGET_H
#include <QtGui>
class ListWidget : public QWidget
{
public:
ListWidget();
private:
QLabel *label;
QListWidget *list;
};
#endif // LISTWIDGET_H
(2) List列表 - listwidget.cpp
#include "listwidget.h"
ListWidget::ListWidget()
{
label= new QLabel;
label->setFixedWidth(70);
list= new QListWidget;
list->addItem(new QListWidgetItem(QIcon(":/images/line.PNG"),tr("Line"))); //添加的对象是QListWidgetItem的指针
list->addItem(new QListWidgetItem(QIcon(":/images/rect.PNG"),tr("Rectangle"))); //item的图标 文字说明
list->addItem(new QListWidgetItem(QIcon(":/images/oval.PNG"),tr("Oval")));
list->addItem(new QListWidgetItem(QIcon(":/images/tri.PNG"),tr("Triangle")));
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(list);
setLayout(layout);
connect(list,SIGNAL(currentTextChanged(QString)),label,SLOT(setText(QString)));
}
(3) List列表 - main.cpp
#include <QtGui>
#include "listwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ListWidget lw; //建立一个ListWidget类
lw.resize(400, 200);
lw.show();
return a.exec();
}
2、tree树形
、
(1) tree树形 - treewidget.h
#ifndef TREEWIDGET_H
#define TREEWIDGET_H
#include <QtGui>
class TreeWidget : public QWidget
{
public:
TreeWidget();
private:
QTreeWidget *tree;
};
#endif // TREEWIDGET_H
(2)tree树形 - treewidget.cpp
#include "treewidget.h"
TreeWidget::TreeWidget()
{
tree = new QTreeWidget(this);
tree->setColumnCount(1); //设定栏数
//QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *parent,constQStringList &strings,int type = Type);
//item属于的树 ,item显示的文字 ,item的类型
QTreeWidgetItem *root = new QTreeWidgetItem(tree,QStringList(QString("Root")));
QTreeWidgetItem *leaf = new QTreeWidgetItem(root,QStringList(QString("Leaf 1")));
root->addChild(leaf);
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root,QStringList(QString("Leaf 1")));
leaf2->setCheckState(0, Qt::Checked);
root->addChild(leaf2);
QList<QTreeWidgetItem *> rootList;
rootList << root;
tree->insertTopLevelItems(0, rootList);
}
。
#include "listwidget.h"
TreeWidget::TreeWidget()
{
tree = new QTreeWidget(this);
tree->setColumnCount(2); //设定栏数
QStringList headers;
headers << "Name" << "Number";
tree->setHeaderLabels(headers);
QStringList rootTextList;
rootTextList << "Root" << "0";
QTreeWidgetItem *root = new QTreeWidgetItem(tree,rootTextList);
QStringList leafTextList;
leafTextList << "Leaf 1" << "1";
QTreeWidgetItem *leaf = new QTreeWidgetItem(root,leafTextList);
root->addChild(leaf);
QStringList leaf2TextList;
leaf2TextList << "Leaf 2" << "2";
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root,leaf2TextList);
leaf2->setCheckState(0, Qt::Checked);
root->addChild(leaf2);
QList<QTreeWidgetItem *> rootList;
rootList << root;
tree->insertTopLevelItems(0, rootList);
}
(3)
3、table表格
(1) tablewidget.h
#ifndef TABLEWIDGET_H
#define TABLEWIDGET_H
#include <QtGui>
class TableWidget : public QWidget
{
public:
TableWidget();
private:
QTableWidget *table;
};
#endif // TABLEWIDGET_H
(2) tablewidget.cpp
#include "tablewidget.h"
TableWidget::TableWidget()
{
table = new QTableWidget(this);
table->setColumnCount(3); //设置列数
table->setRowCount(5); //设置行数
QStringList headers;
headers << "Line Number" << "ID" << "Name" << "Age"<< "Sex";
table->setHorizontalHeaderLabels(headers);
table->setItem(0, 0, new QTableWidgetItem(QString("1"))); //按坐标放置
table->setItem(1, 0, new QTableWidgetItem(QString("2")));
table->setItem(2, 0, new QTableWidgetItem(QString("3")));
table->setItem(3, 0, new QTableWidgetItem(QString("4")));
table->setItem(4, 0, new QTableWidgetItem(QString("5")));
table->setItem(0, 1, new QTableWidgetItem(tr("20100112")));
}
(3)
- - END - -
。
。
。