一、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. 学习JAVAWEB第十三天

    会话技术 1. 会话:一次会话中包含多次请求和响应. * 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2. 功能:在一次会话的范围内的多次请求间,共享数据 3. 方式: ...

  2. 线程终止的四种方式,interrupt 方法使用的简单介绍。

    一 正常结束. package com.aaa.threaddemo; /* 一 终止线程的四种方式? * 程序运行结束,线程终止. * */ public class ThreadTerminati ...

  3. vue中router与route区别

    1.$route对象 $route对象表示当前的路由信息,包含了当前 URL 解析得到的信息.包含当前的路径,参数,query对象等. 1.    $route.path      字符串,对应当前路 ...

  4. [论文][半监督语义分割]Semi-Supervised Semantic Segmentation with High- and Low-level Consistency

    Semi-Supervised Semantic Segmentation with High- and Low-level Consistency TPAMI 2019 论文原文 code 创新点: ...

  5. bom案例1-div拖拽

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. bom-删除提示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. visual studio版本 宏

    转载请注明来源:https://www.cnblogs.com/hookjc/ MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) MSVC++ 11. ...

  8. Android SDK:Android standard develop kits 安卓开发的工具集

    目前主流的安卓开发工具: 1.Adnroid-Adt-bundle SDK Manager.exe: Tools(安卓的开发小工具) 各种安卓版本 Extras 额外的开发包 在线更新/安装的安卓版本 ...

  9. Windows安装RabbitMQ过程及相关问题

    一.下载 1.首先需要下载erlang,下载地址:http://www.erlang.org/downloads 2.其次需要下载RabbitMQ,下载地址:https://www.rabbitmq. ...

  10. Nodejs path对象

    很快Node就会迎来4.0的时代,届时将并入现有的iojs,所以先前写过的iojs入门系列直接更名为NodeJS入门. 本篇开始将逐个介绍Node的各主要模块,依循API文档走一遍,但会给出比API文 ...