一、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(一)的更多相关文章

  1. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  2. Ubuntu 下安装QT

    Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...

  3. Qt安装配置

    Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...

  4. Qt信号与槽自动关联机制

    参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...

  5. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  6. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  7. Qt——组件位置随窗口变化

    当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...

  8. (转) Qt 出现“undefined reference to `vtable for”原因总结

    由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...

  9. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  10. Qt 开启鼠标跟踪,自动激活mouseMoveEvent的问题

    最近在Qt上实现一个功能,鼠标在图片上移动,触发mouseMoveEvent事件,进而生成一个小的半透明窗口,放大显示以鼠标为中心的一个区域的图像并随鼠标移动.但是,必须鼠标摁下,才触发mouseMo ...

随机推荐

  1. python_f-string格式化字符串文字

    一.简介 f-string,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法. f-string在形式上是以 f 或 F ...

  2. aws 试题

    /* Domain 1 Design Resilient Architectures 1. Which of the following statements regarding S3 storage ...

  3. libevent网络库

    1.概述 libevent是一个C语言编写的.轻量级开源高性能事件通知库.作为底层网络库,已经被广泛应用(如:memcached.Vomit.Nylon.Netchat等).主要有以下几个亮点: 事件 ...

  4. MySQL 5.7.19 简易安装、卸载教程

    前言:传统的 exe 文件安装的MySQL,安装后特别难卸载,而且一旦处理不好,就容易出错,想再安装别的版本也不容易.因为这种方式的安装,虽然是不断的下一步,但是卸载的时候需要处理很多,在本文最后,有 ...

  5. NSMutableArray基本概念

    1.NSMutableArray介绍 什么是NSMutableArray NSMutableArray是NSArray的子类 NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, ...

  6. 在view中实现UIViewController的跳转 By H.L

    view中是不能进行UIViewController的push,pop等操作的,若进行跳转操作,一般是用代理,block,通知等实现,那如何实现在ViewController的subView中实现跳转 ...

  7. Junit4进行参数化测试

    @RunWith, 当类被@RunWith注解修饰,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解所指明的运行器(runner)来运行测试,而不是JUnit默认的运行器. 要进行参数化测 ...

  8. Spark——统计文本中单词出现的次数

    示例一:统计所有单词出现的次数 1.在本地创建文件并上传到hdfs中 #vin data.txt //将文件上传到hadoop的根目录下 #hdfs dfs -put data.txt / 2.在sp ...

  9. ubuntu Python2 升级Python3

    今天买了一台阿里的服务器, 想搭建一个爬虫, 但是 服务器是python2的, 需要升级到python3 1. 下载python3的包 wget https://www.python.org/ftp/ ...

  10. Vue2.0源码学习(4) - 合并配置

    合并配置 通过之前的源码学习,我们已经了解到了new Vue主要有两种场景,第一种就是在外部主动调用new Vue创建一个实例,第二个就是代码内部创建子组件的时候自行创建一个new Vue实例.但是无 ...