qt(一)
一、Qt安装
qt离线安装地址:http://download.qt.io/archive/qt/
参考教程:https://blog.csdn.net/u013934107/article/details/80712418
二、Qt环境搭建
Qt官网:https://www.qt.io/
1、工程目录下创建3rdparty文件夹,并将Qt的依赖库拷贝进去

2、配置项目根目录的CMakeLists.txt文件,添加如下内容
cmake_minimum_required(VERSION 3.15)
project(qt_fuxi_day01) set(CMAKE_CXX_STANDARD 14) # 自动调用moc,uic,rcc处理qt的扩展部分
set(CMAKE_AUTOMOC ON)# 信号和槽
set(CMAKE_AUTOUIC ON)# ui
set(CMAKE_AUTORCC ON)# 位置 set(CMAKE_INCLUDE_CURRENT_DIR ON) # 设置find__xxx的路径 这种方法是把qt拷到项目中去
#set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qt) # 设置qt的全局路径
set(G_PATH /home/kongws/Qt5.9.9/5.9.9/gcc_64/lib/cmake) # 找包,这里不关联动态库
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${G_PATH})
#find_package(Qt5 COMPONENTS Widgets) # 设置find__xxx的路径
#set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qt) # qt config
file(
WRITE
${CMAKE_CURRENT_SOURCE_DIR}/build/bin/qt.conf
"[Paths]
#Prefix=../lib/Qt
#Binaries=bin
#Libraries=lib
Plugins=${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qt/plugins
#Imports=imports
#Qml2Imports=qml"
)
# 查找qt库
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Qt5Network REQUIRED) # 定义变量 保存so库
SET(QT_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5OpenGL_LIBRARIES}
${Qt5Network_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5Qml_LIBRARIES})
# 头文件 路径
include_directories(
${Qt5Core_INCLUDE_DIRS}
${Qt5Gui_INCLUDE_DIRS}
${Qt5Widgets_INCLUDE_DIRS}
${Qt5Network_INCLUDE_DIRS}) #线程
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -lpthread -Wl,--no-as-needed -g3 -Wall")
# 与位置无关
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") #add_executable(qt_fuxi_day01 01_socket/main.cpp)
add_subdirectory(01_socket)
子文件夹下(名称:01_socket)的cmakelist:
add_executable(main main.cpp)
#add_executable(main_01 main_01.cpp ClientWindow.cpp ServerWindow.cpp) target_link_libraries(main ${QT_LIBRARIES})
3、工程中链接Qt库
add_executable(firstqt main.cpp)
target_link_libraries(
firstqt
${QT_LIBRARIES}
)
其中
QT_LIBRARIES是配置好的Qt库的变量
测试环境是否搭建好:
#include <iostream>
#include <QApplication>
#include <QWidget>
int main(int argc , char **argv) {
QApplication qa(argc , argv); //创建窗口
QWidget w;
//显示窗口
w.show(); std::cout << "Hello, World!" << std::endl;
return qa.exec();
}
三、 窗口和布局
1. 添加窗口
通常一个程序可能会有多个窗口,此时可以采用类的方式来定义窗口.
定义窗口
class MyWindow : public QWidget{
public:
MyWindow(){
cout << "执行了窗口的构造" << endl;
//创建按钮
QPushButton *btn = new QPushButton();
//设置它的父亲是 这个窗口,也就是表示,它是窗口的一份子。
btn->setParent(this);
}
~MyWindow(){
cout << "执行了窗口的析构" << endl;
}
};
- 程序显示
int main(int argc , char **argv) {
QApplication qa(argc , argv);
//创建窗口
MyWindow w;
//显示窗口
w.show();
std::cout << "Hello, World!" << std::endl;
return qa.exec();
}
- 设置窗口图标、标题、大小
class MyWindow : public QWidget{
public:
MyWindow(){
cout << "执行了窗口的构造" << endl;
//创建按钮
QPushButton *btn = new QPushButton("button" ,this);
//设置窗口图标
setWindowIcon(QIcon("../nlm_icon.jpg"));
//设置窗口标题
setWindowTitle(QString::fromLocal8Bit("中文"));
//设置大小 允许拖拽
resize(400,300);
}
~MyWindow(){
cout << "执行了窗口的析构" << endl;
}
};
2. 基本UI
记住一个核心: 所有的空间应该都依附于窗口里面。不要直接独立显示。
按钮
QPushButton *btn = new QPushButton("button" ,this);
文本
显示中文,需要转化。
//参数一: 内容, 参数二:表示父窗口是谁。
QLabel *q = new QLabel(QString::fromLocal8Bit("姓名: ") ,this );
- 输入框
QLineEdit *edit = new QLineEdit( this);
edit->setPlaceholderText(QString::fromLocal8Bit("请输入姓名"));
- 大小和位置
//表示最大和最小的大小值,可以使用鼠标拖拽
setMaximumSize(600,500);
setMinimumSize(400,300); //设置固定大小 : 禁止放大和拖拽
setFixedSize(100,50); //设置位置 从左往右: x坐标, y的坐标 宽度和高度
setGeometry(50 ,50 , 40,20);
3. 布局
在Qt里面布局分为四个大类 :QBoxLayout | QFormLayout | QGridLayout | QStackedLayout
QBoxLayout : 直译为:盒子布局,快速构建的话,一般使用它的两个子类QHBoxLayout 和 QVBoxLayout 负责水平和垂直布局
QGridLayout : 网格布局,有的人称之为九宫格布局
QFormLayout: 一般适用于提交数据form表单。比如: 登录,注册类似的场景
QStackedLayout : 提供了多页面切换的布局,一次只能看到一个界面。
1. QBoxLayout
示例

示例代码
下面的代码
MyWindow(){
cout << "执行了窗口的构造" << endl;
//创建垂直布局
QVBoxLayout *layout = new QVBoxLayout;
//第一组单选组
QGroupBox *box1 = new QGroupBox;
//使用垂直布局包装
QVBoxLayout *layout1 = new QVBoxLayout;
QRadioButton *btn1 = new QRadioButton(QString::fromLocal8Bit("抽烟"));
QRadioButton *btn2 = new QRadioButton(QString::fromLocal8Bit("喝酒"));
QRadioButton *btn3 = new QRadioButton(QString::fromLocal8Bit("烫头"));
layout1->addWidget(btn1);
layout1->addWidget(btn2);
layout1->addWidget(btn3);
//把包装好的选项,放到groupBox中。
box1->setLayout(layout1);
//第二个单选组
QGroupBox *box2 = new QGroupBox(QString::fromLocal8Bit("性别: "));
QHBoxLayout *layout2 = new QHBoxLayout;
QRadioButton *btn4 = new QRadioButton(QString::fromLocal8Bit("男"));
QRadioButton *btn5 = new QRadioButton(QString::fromLocal8Bit("女"));
layout2->addWidget(btn4);
layout2->addWidget(btn5);
//把包装好的选项,放到groupBox中。
box2->setLayout(layout2);
//把两组放到整体布局中
layout->addWidget(box1);
layout->addWidget(box2);
//设置这个窗口的布局
setLayout(layout);
}
2. QGridLayout

class GridWnd : public QWidget{
public:
GridWnd(){
QString strs{
"7", "8", "9", "+", "(",
"4", "5", "6", "-", ")",
"1", "2", "3", "*", "<-",
"0", ".", "=", "/", "C"
};
//整体垂直布局。
QVBoxLayout *layout = new QVBoxLayout;
//输入框
QLineEdit *edit = new QLineEdit;
layout->addWidget(edit);
//网格布局
QGridLayout *layout1 = new QGridLayout;
for (int i = 0; i < strs.length(); ++i) {
//循环一次,有一个按钮。
QPushButton *btn = new QPushButton(strs[i]);
//把这个按钮放置到某行某列去。
layout1->addWidget(btn,i/5,i%5);
}
//追加到主布局中。
layout->addLayout(layout1);
//设置布局
setLayout(layout);
}
};
3. QToolBox

class QToolWnd : public QWidget{
public:
QToolWnd(){
//负责总的布局
auto *layout = new QVBoxLayout;
//负责做组切换
auto *toolbox = new QToolBox;
//使用QGroupBox 来包装垂直布局。
QGroupBox *box1 = new QGroupBox;
//用垂直布局,先包装三个同学。
QVBoxLayout *cz = new QVBoxLayout;
QLabel * label1 = new QLabel(QString::fromLocal8Bit("张三"));
QLabel * label2 = new QLabel(QString::fromLocal8Bit("李四"));
QLabel * label3 = new QLabel(QString::fromLocal8Bit("王五"));
cz->addWidget(label1);
cz->addWidget(label2);
cz->addWidget(label3);
//使用box来包装垂直布局
box1->setLayout(cz);
QGroupBox *box2 = new QGroupBox;
QVBoxLayout *hs = new QVBoxLayout;
QLabel * label4 = new QLabel(QString::fromLocal8Bit("刘备"));
QLabel * label5 = new QLabel(QString::fromLocal8Bit("关羽"));
QLabel * label6 = new QLabel(QString::fromLocal8Bit("张飞"));
hs->addWidget(label4);
hs->addWidget(label5);
hs->addWidget(label6);
//使用box来包装垂直布局
box2->setLayout(hs);
//最后把这一块放到选项组里面。
toolbox->addItem( box1, QString::fromLocal8Bit("初中好友"));
toolbox->addItem( box2, QString::fromLocal8Bit("高中好友"));
//整体布局就一个工具盒
layout->addWidget(toolbox);
setLayout(layout);
}
};
4. QTableWidget
QTableWidget是QT程序中常用的显示数据表格的空间

class QTableWnd : public QWidget{
public:
QTableWnd(){
auto *table = new QTableWidget(4,4,this);
QStringList list{
QString::fromLocal8Bit("姓名"),
QString::fromLocal8Bit("年龄"),
QString::fromLocal8Bit("成绩"),
QString::fromLocal8Bit("性别"),
};
table->setHorizontalHeaderLabels(list);
table->setFixedSize(500,300);
QTableWidgetItem *item = new QTableWidgetItem(QString::fromLocal8Bit("张三"));
QTableWidgetItem *item2 = new QTableWidgetItem(QString::fromLocal8Bit("18"));
table->setItem(0 ,0 , item);
table->setItem(0 ,1 , item2);
}
};
4. 自定义UI
除了系统定义好的控件之外,我们还可以在控件中绘制文字、图片以及不规则的几何图形到控件中
可以在
paintEvent方法中通过QPainter进行绘制
绘制直线
class QLineWnd : public QWidget{
void paintEvent(QPaintEvent *event){
QPainter * painter = new QPainter(this);
QPen *p = new QPen(QColor(Qt::GlobalColor::red));
painter->setPen(*p);
painter->drawLine(100,100,200,200);
}
};
- 绘制文字
//绘制事件
void MainWindow::paintEvent(QPaintEvent *event){
//创建画家
QPainter *painter = new QPainter(this);
//画笔
QPen *p = new QPen(QColor(Qt::GlobalColor::red));
//替换画笔
painter->setPen(*p); //绘制文字
painter->drawText(300,300,"中国");
}
- 绘制矩形
//绘制事件
void MainWindow::paintEvent(QPaintEvent *event){
//创建画家
QPainter *painter = new QPainter(this);
//画笔
QPen *p = new QPen(QColor(Qt::GlobalColor::red));
//替换画笔
painter->setPen(*p); //绘制矩形
painter->drawRect(50,50,200,200)
}
- 绘制扇形
//绘制事件
void MainWindow::paintEvent(QPaintEvent *event){
//创建画家
QPainter *painter = new QPainter(this);
//画笔
QPen *p = new QPen(QColor(Qt::GlobalColor::red));
//替换画笔
painter->setPen(*p); //绘制扇形
/**
* 参数1:矩形左上角x
* 参数2:矩形左上角y
* 参数3:矩形宽度
* 参数4:矩形高度
* 参数5:扇形开始角度
* 参数6:扇形扫过的角度
*/
painter->drawArc(300,300,100,100,0,30*16);
}
- 绘制圆形
//绘制事件
void MainWindow::paintEvent(QPaintEvent *event){
//创建画家
QPainter *painter = new QPainter(this);
//画笔
QPen *p = new QPen(QColor(Qt::GlobalColor::red));
//替换画笔
painter->setPen(*p); //绘制圆形
painter->drawEllipse(200,200,100,100);
}
- 绘制多边形
//绘制事件
void MainWindow::paintEvent(QPaintEvent *event){
//创建画家
QPainter *painter = new QPainter(this);
//画笔
QPen *p = new QPen(QColor(Qt::GlobalColor::red));
//替换画笔
painter->setPen(*p); QPoint point1(100,100);
QPoint point2(100,150);
QPoint point3(150,100);
QPoint point4(150,200);
QPoint point5(100,100); QPoint arr[] = {point1,point2,point3,point4,point5};
//绘制多边形
painter->drawConvexPolygon(arr,4);
}
qt(一)的更多相关文章
- QT内省机制、自定义Model、数据库
本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...
- Ubuntu 下安装QT
Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...
- Qt安装配置
Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...
- Qt信号与槽自动关联机制
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
- 保持Qt GUI响应的几种方法
最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- Qt——组件位置随窗口变化
当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...
- (转) Qt 出现“undefined reference to `vtable for”原因总结
由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...
- qt中ui的 使用介绍
1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...
- Qt 开启鼠标跟踪,自动激活mouseMoveEvent的问题
最近在Qt上实现一个功能,鼠标在图片上移动,触发mouseMoveEvent事件,进而生成一个小的半透明窗口,放大显示以鼠标为中心的一个区域的图像并随鼠标移动.但是,必须鼠标摁下,才触发mouseMo ...
随机推荐
- MySQL OOM
问题 前几天遇到一个奇怪的问题,服务器内存明明够用,结果在对 MySQL 进行测压的时候却出现了 OOM,是 Linux 内核出错了吗? 具体现象如下:使用 sysbench 对 mysql 进行压测 ...
- MySQL数据库索引介绍
一.什么是索引 索引是mysql数据库中的一种数据结构,就是一种数据的组织方式,这种数据结构又称为key 表中的一行行数据按照索引规定的结构组织成了一种树型结构,该树叫B+树 二.为何要用索引 优化查 ...
- RPC调用获取参数值
本文以 RPC 获取百度登录password加密值为例: 涉及的知识点有: 1.js调试,寻找加密代码 2. 浏览器本地代码替换 3. js自执行函数 4. 插桩 5. RPC 远程调用 6. pyt ...
- checklist 编写指南
checklist 编写工具 checklist文档格式推荐使用思维导图.比如 MindMaster 和 processon.我喜欢用这些平台或者软件的思维导图大纲模式来编写 checklist. c ...
- 学习MyBatis必知必会(6)~Mapper基础的拓展
一.typeAlias 类型别名[自定义别名.系统自带别名] 1.类型别名:为 Java 类型设置一个缩写名字. 它仅用于 XML 配置,意在降低冗余的全限定类名书写 2.配置自定义别名: (1)方式 ...
- docker容器编排 (4)
容器编排 我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦.如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排.Docker原生对容器编排的 ...
- 修复 WordPress 通过邮箱 找回密码时的链接无效&新用户注册时提示的链接无效
感谢大佬:https://blog.csdn.net/xiaobinqt/article/details/83055058 感谢大佬:https://www.wpdaxue.com/lost-pass ...
- centos安装php7.2
目前php最高稳定版本是7.2,wordpress中也建议采用该版本. 若直接采用centos中的yum安装:sudo yum -y install php,版本是5.4,远远不够,因此我们要手动更新 ...
- Java基础复习(四)
1.Integer与int的区别 int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默 ...
- 数据库监测sql执行
SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...