QT

本文详细介绍了QT框架,涵盖视图类中的窗口、界面布局、颜色改变、绘图、图像处理、菜单栏、工具栏、状态栏、事件处理、国际化、信号与槽机制、线程、定时器等内容。讲解了窗口布局的技巧,如使用布局管理器、弹簧和窗口大小调整。还深入探讨了绘图事件,包括QPainter的使用,如绘制线条、圆弧、图像以及渐变色。此外,文章还涉及到C++基础,如头文件声明与定义、函数指针、const用法,以及QT中的QCustomPlot图表库、程序关闭后的自动保存、时间轴控件实现等内容。
摘要由CSDN通过智能技术生成

QT

文章目录

一 视图类

1 关于窗口的函数

Qt全屏显示函数           showFullScreen() 
Qt最大化显示函数         showMaximized()
Qt最小化显示函数         showMinimized()
Qt固定尺寸显示函数       resize(x,y)
Qt设置最大尺寸函数       setMaximumSize(w,h)
Qt设置最小尺寸函数       setMinimumSize(w,h)

2 界面布局

ui调整界面布局

  1. 实现登录窗口
  2. 利用布局方式,给窗口美化
  3. 选取widget进行布局,水平布局,垂直布局,栅格布局
  4. 给用户名、密码、登陆、退出按钮进行布局
  5. 默认窗口和控件之间有9像素间隙,可以调整layoutLeftMargin
  6. 利用弹簧进行布局
    1. 布局的时候,窗口大小会自动变化
    2. 弹簧的固定大小模式,和窗口的随布局变化大小模式,需要熟练掌握。固定模式或者扩展模式。

3 widget改变颜色

ui->widget->setAttribute(Qt::WA_StyledBackground,true);
//   ui->widget->setStyleSheet("background:blue");
   ui->widget->setStyleSheet("background-color: rgb(35,0, 255)");//设置左边框体颜色

4 splitter

#include "mainwindow.h"
#include <QApplication>
#include <QSplitter>
#include <QTextCodec>
#include <QTextEdit>
#include <QObject>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();
 
    QFont font("ZYSong18030" , 12);
    a.setFont(font);
 
    QSplitter *splitterMain = new QSplitter(Qt::Horizontal, 0); //新建主分割窗口,水平分割
 
    QTextEdit *textLeft = new QTextEdit(QObject::tr("左部件"),splitterMain);
    textLeft->setAlignment(Qt::AlignCenter);
 
    QSplitter *splitterRight = new QSplitter(Qt::Vertical, splitterMain);   //右分割窗口,并以主分割窗口作为父窗口
    splitterRight->setOpaqueResize(false);
 
    QTextEdit *textUp = new QTextEdit(QObject::tr("上部件"),splitterRight);
    textUp->setAlignment(Qt::AlignCenter);
 
    QTextEdit *textMiddle = new QTextEdit(QObject::tr("中间部件"),splitterRight);
    textMiddle->setAlignment(Qt::AlignCenter);
 
    QTextEdit *textBottom = new QTextEdit(QObject::tr("底部部件"),splitterRight);
    textBottom->setAlignment(Qt::AlignCenter);
 
    splitterMain->setStretchFactor(1,1);
    splitterMain->setWindowTitle(QObject::tr("分割窗口"));
    splitterMain->show();
 
    return a.exec();
}

5 TreeWidget

QTreeWidgetItem::addChild(QTreeWidgetItem*)   //用于根节点添加子节点

QTreeWidget::setColumnCount ;                           //用于设置表中的列的列数目,在表头中会有对应的显示,

QTreeWidget::setHeaderHidden();                         //隐藏表头

QTreeWidgetItem::setSortingEnabled(bool)          //可以用来设置是否可以排序,当为true时候,点击表头,会自动排序

openPersistentEditor和closePersistentEditor        //用来控制某一item是否可以编辑

 

QTreeWidgetItem * QTreeWidget::currentItem ()  //const返回当前的item指针,

int QTreeWidget::currentColumn ()                        // const放回当前item的列编号

QTreeWidgetItem * QTreeWidget::itemAt ( int x, int y ) const返回给定的位置的item指针

QTreeWidgetItem * QTreeWidget::itemBelow ( const QTreeWidgetItem * item ) const       //返回指定的item下面item

QTreeWidgetItem * QTreeWidget::itemAbove ( const QTreeWidgetItem * item ) const       //返回指定的item上面item

查找item时候,通QListWidget和QTableWidget一样,同样有多个查找匹配模式

QList<QTreeWidgetItem *> QTreeWidget::findItems ( const QString & text, Qt::MatchFlags flags, int column = 0 ) const

 

//显示隐藏列:

setSectionHidden(int, bool);isSectionHidden(int);

增加删除顶层用:

addTopLevelItem(QTreeWidgetItem*);

takeTopLeveltem(int);

topLevelItem(int); //返回

topLevelItemCount();

增加删除子层:

addChild(QTreeWidgetItem*);

addChildren(const QList<QTreeWidgetItem*>&);

takeChild(int);

takeChildren();

child(int)  //返回

childCount();

 

//排序

treeWidget->setSortingEnabled(true);

treeWidget->header()->setSortIndicatorShown(true);

treeWidget->header()->setSortIndicator(0, Qt::AscendingOrder);

//要自定义就用信号

connect( treeWidget->header(), SIGNAL( sectionClicked(int) ), this, SLOT( sectionClickedSlot(int) ) );

 

添加表头的两种方法

方法一:

QStringList header;

header<<"ECJTU"<<"CERT";

treewidget->setHeaderLabels(header); //设置表头

方法二:

QStringList header;

header<<"ECJTU"<<"CERT";

QTreeWidgetItem *head=new QTreeWidgetItem((QTreeWidget*)0,header);

treewidget->setHeaderItem(head);

 

初始化用基本用到的:

//this->setMouseTracking(true);

this->setRootIsDecorated(false);

this->setSelectionMode(QAbstractItemView::ExtendedSelection);

this->setStyleSheet("QTreeWidget::item{height:25px}");  //设置行宽,     我也找不到提供的接口  setStyleSheet很强大建议看

this->setColumnWidth(0, 100);  //设置列宽

this->setColumnCount(2);

QStringList lists;

lists << "NO" << "name";

this->setHeaderLabels(lists);

 

for (int i=0;i<10;i++)

{

QStringList contentList;

contentList << QString("00%1").arg(i) << "boy";

QTreeWidgetItem *pNewItem = new QTreeWidgetItem(this, contentList);  //增加

pNewItem->setBackgroundColor(0, QColor(150,0,0));

pNewItem->setFont(0, QFont());

}

//pNewItemRoot->setExpanded(true);  //展开子项

 

进阶:

          //加checkbox, icon

          pNewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);

          pNewItem->setCheckState(0, Qt::Unchecked);

         //pNewItem->setIcon(int , QIcon);

        //向ITEM里放一些QT的控件,如QSpinBox,QComboBox,QPushButton等

         this->setItemWidget(pNewItem, 0, new QSpinBox());

 

         //获取某项的QRect, 有时候会很有用,如显缩略图:

         QRect rect = this->visualItemRect(QTreeWidgetItem*);

          //右键菜单重写

         contextMenuEvent( QContextMenuEvent * event );或者使用信号itemPressed(QTreeWidgetItem*, int);

        //对头的操作,可以用QLabel或者QTreeWidgetItem对头进行初始化,

         //隐藏头

         header()->hide();

         m_pHeaderView->setClickable(true);  //能够发射sectionClicked(int)信号,可做菜单,

          m_pHeaderView->setMovable(true);

          m_pHeaderView->setResizeMode(0, QHeaderView::Fixed);  //固定列宽

          m_pHeaderView->setDefaultSectionSize(100);  //默认

         //排序

         treeWidget->setSortingEnabled(true);

        treeWidget->header()->setSortIndicatorShown(true);

        treeWidget->header()->setSortIndicator(0, Qt::AscendingOrder);

         treeWidget->header()->setSectionHidden(1, true);//隐藏列

       //要自定义就用信号

        connect( treeWidget->header(), SIGNAL( sectionClicked(int) ), this, SLOT( sectionClickedSlot(int) ) );

6 绘图

  1. 绘图事件,void paintEvent()
  2. 声明一个画家对象 QPainter painter(this) this指定绘图设备
  3. 画线 画图 画矩形 画文字
  4. 设置画笔QPen 设置画笔宽度、风格
  5. 设置画刷QBursh 设置画刷风格
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QPainter>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

void MainWindow::paintEvent(QPaintEvent *)
{
    //声明画家类,
    QPainter painter(this);

    //设置画笔
    QPen pen(QColor(255,0,0));
    //设置画笔宽度
    pen.setWidth(5);
    //设置画笔风格
   // pen.setStyle(Qt::DotLine);


    //设置画刷
    QBrush brush(QColor(255,0,0,100));  //最后一个参数是透明度
    brush.setStyle(Qt::Dense7Pattern);
    painter.setBrush(brush);
    //让画家使用这个笔
    painter.setPen(pen);

    //画线
    painter.drawLine(QPoint(0,0),QPoint(1000 ,500));
    //画圆
    painter.drawEllipse(QPoint(100,100),100,100);
    //画矩形
    painter.drawRect(QRect(QPoint(50,50),QPoint(500,500)));
    //画文字
    painter.drawText(QRect(QPoint(50,50),QPoint(250,250)),"天天学习,天天向上");
//    painter.drawText(QRect());

    //高级设置
    //抗锯齿
    painter.setRenderHint(QPainter::Antialiasing);
    //画矩形
    painter.drawRect(QRect(QPoint(20,20),QPoint(50,50)));

    //移动画家
    painter.translate(30,0);
//    painter.drawRect(QRect(QPoint(20,20),QPoint(50,50)));
    painter.drawRect(QRect(QPoint(20,20),QPoint(50,50)));

    //保存画家状态
    painter.save();

    painter.translate(100,0);
    //恢复画家状态到保存的时间点
    painter.restore();
    painter.drawRect(QRect(QPoint(20,20),QPoint(50,50)));




}

MainWindow::~MainWindow()
{
    delete ui;
}


drawImage

Qt帮助文档里的函数声明:

void QPainter::drawImage ( const QRect & target, const QImage & image, const QRect & source, Qt::ImageConversionFlags flags = Qt::AutoColor )

举例:
QRect target(10.0, 20.0, 80.0, 60.0); //建立目标矩形,该区域是显示图像的目的地
QRect source(0.0, 0.0, 70.0, 40.0); //建立源矩形,用来划定来自外部的源图像文件中需要显示的区域
QImage image(":/images/myImage.png"); //建立QImage类对象

QPainter painter(this);
painter.drawImage(target, image, source); //将源图像文件中(0.0, 0.0, 70.0, 40.0)位置的图像画到目标绘图设备中的(10.0, 20.0, 80.0, 60.0)位置上,大小自适应

7 image

image实现放大缩小位移
painter1.drawImage(QRect( 0,50,2400,200),image);//改变painter对画布进行draw操纵时候的操作 即可实现放大缩小,超级简单

8 QMainWindow

1 菜单栏

菜单栏最多有一个

QMenuBar *bar= MenuBar;//创建菜单栏
setMenuBar(bar);//添加菜单栏
QMenu *fileMenu=bar->addMenu("文件");//创建菜单
QAction *newAction =fileMenu->addAction("新建");//创建菜单项
fileMenu->addSeparator();//添加分割线


2 工具栏

工具栏可以有多个

QToolBar* bar=new QToolBar(this);
addToolBar(停靠区域,bar);// Qt::LeftToolBarArea
设置后期停靠区域,设置浮动,设置移动(总开关)
bar->setMovable(false);
bar->setAllowedAreas();

3状态栏

状态栏只能有一个

QStatusBar*stBar=statusBar(this);
setStatusBar(stBar);//添加
stBar->addWidget(label);//添加左侧信息
stBar->addPermanentWidget(label);//放右侧信息

4 铆接部件

浮动窗口 可以多个

QDockeWidget
addDockWidget(默认停靠区域,浮动窗口指针)
设置后期停靠区域

5 核心部件
setCentralWidget()
6 资源文件

右键项目->添加新项目->Qt->Qt Resource File -> 给资源文件起名

res 生成 res.qrc

open in editor

7 添加图标
 ui->setupUi(this);
    ui->actionXinjian->setIcon(QIcon(":/image/1.jpg"));

9 隐藏部件

this->setVisible(0);
    this->setVisible(1);
    // 隐藏控件在屏幕上显示、不再占位置会改变布局。

    this->hide();
    this->show();
    // 通过析构和重新new实现显示/隐藏、不再占位置会改变布局。

    this->setFixedSize(36, 25);
    this->setFixedSize(36, 0);
    // 通过改变大小实现隐藏/显示、不再占位置会改变布局。

    QString btn_background=":xxx.png";
    this->setStyleSheet("border:none;background-image:url();");
    this->setStyleSheet(QString("border:none;background-image:url(%1);").arg(btn_background));
    // 通过改变背景图片实现显示/隐藏,占位置不改变布局,隐藏时候鼠标在该位置按下还会发送信号

	
	QString btn_backgrounds=":xxx.png||:xxxx.png";
 	QStringList tmp = sheet.split("||");
    this->setStyleSheet(
        QString("QPushButton:checked{"
                "border:none;"
                "background-image:url(%1);}"
                "QPushButton:!checked"
                "{border: none;"
                "background-image:url(%2);}").arg(tmp[0]).arg(tmp[1]));
     // 通过自身状态改变背景图片实现显示/隐藏,这里用的是checked,可以换成自定义属性,占位置不改变布局,隐藏时候鼠标在该位置按下还会发送信号

10 视口窗口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pg2ZDmXC-1606889098614)(C:\Users\homily\AppData\Roaming\Typora\typora-user-images\image-20200914205747459.png)]

**窗口:**逻辑环境中的一个矩形框,使用逻辑坐标,图中世界坐标和窗口坐标外围的虚线框即为窗口。窗口具有原点和长宽,这也就决定了窗口的位置和大小。**窗口存在的意义即是为了确定人类世界中的某个物体需要显示的位置和范围。**如我要显示地图中的江苏部分,我就需要将窗口的原点位置设置为江苏,长宽设置为江苏省的外接矩形大小。如果我要显示地图中的中国部分,则将窗口扩大,原点设置为中国,长宽设置为中国的外接矩形大小。在视口不变的情况下,扩大窗口其实就是相当于对地图进行了缩小。

**视口:**设备环境中的一个矩形框,使用物理坐标,和设备的大小密切相关,超出设备外的视口区域不予显示。视口存在的意义是指定在显示设备的哪个地方,以多大的范围完全显示指定的窗口内容。

 QPainter painter(this);
         int w = width();
         int h = height();
         int side = qMin(w,h);
         QRect rect(0,0,side,side);//在自己的框框里,从哪里开始画图
//         QRect rect((w-side)/2,(h-side)/2,side,side);
         painter.drawRect(rect);
     painter.setViewport(rect);            // 设置ViewPort
      painter.setWindow(0,0,200,200); // 设置窗口 逻辑坐标,在真正的框框中 从哪里开始画图

      QPen pen(Qt::red);
      painter.setPen(pen);

      painter.drawEllipse(0,0,100,50);
      painter.drawEllipse(50,50,100,50);
      painter.drawEllipse(100,50,100,50);

11 chart

0x02 包含charts头文件并引用QT charts命名空间

  • main.cpp:
// 包含line chart需要的头文件
#include <QChartView>
#include <QLineSeries>
// 引用命名空间
QT_CHARTS_USE_NAMESPACE

int main(){
	...
}
123456789

0x03 创建QLineSeries并添加数据

折线图的实现需要创建一个QLineSeries对象用于保存和绘制折线数据:

  • main.cpp:
// new 一个 QLineSeries实例
QLineSeries *series = new QLineSeries();
// 添加实验数据,可以用 append 方法或者 >> 操作符
series->append(0,2);
series->append(QPointF(2,6));
series->append(3,8);
series->append(7,9);
series->append(11,3);

*series << QPointF(11,2) << QPointF(15,5) << QPointF(18,4) << QPointF(19,2);

1234567891011

0x04 创建QChart用于显示数据

创建好series后,需要创建一个QChart实例并关联series,创建坐标才能将数据显示出来:

  • main.cpp:
QChart *chart = new QChart();
// 将图例隐藏
chart->legend()->hide();
// 关联series,这一步很重要,必须要将series关联到QChart才能将数据渲染出来:
chart->addSeries(series);
// 开启OpenGL,QLineSeries支持GPU绘制,Qt其他有的图表类型是不支持的。
series->setUseOpenGL(true);
// 创建默认的坐标系(笛卡尔坐标)
chart->createDefaultAxes();
// 设置图表标题
chart->setTitle(QStringLiteral("Qt line chart example"));
1234567891011

0x05 创建QChartView对象并显示图表

这里创建QChartView对象是为了将最终结果显示到界面,如果不想用QChartView,也可以选择QGraphicsView scene来显示。

  • main.cpp:
QChartView *view = new QChartView(chart);
// 开启抗锯齿,让显示效果更好
view->setRenderHint(QPainter::Antialiasing);
view->resize(400,300);
// 显示图表
view->show();

12 渐变色

Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice和QPaintEngine这三个类。它们三者的关系如下图所示:

QPainter用来执行绘图操作;
QPaintEngine提供了一些接口,可以用于QPainter在不同的设备上进行绘制;
QPaintDevice提供绘图设备,它是一个二维空间的抽象,可以使用QPainter在其上进行绘制。
绘图系统中由QPainter来完成具体的绘制操作,提供了大量髙度优化的函数来完成GUI编程所需要的大部分绘制工作。QPainter可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片。QPainter可以在继承自QPaintDevice类的任何对象上进行绘制操作。

QPainter—般在一个部件重绘事件( PaintEvent )的处理函数paintEvent ()中进行绘制,首先要创建QPainter对象(画笔),然后进行图形的绘制, 最后销毁QPainter对象。

回到顶部
一、基本图形的绘制
在QPainter中提供了一些方便的函数来绘制常用的图形,而且还可以设置线条和边框的画笔以及进行填充的画刷。

新建Qt Gui应用,项目名称为 myDrawing,基类选择QWidget,类名为Widget。建立完成后,在widget.h文件中声明重绘事件处理函数:

protected:
void paintEvent(QPaintEvent *);
然后到widget.cpp文件中添加头文件#include 。

1.1 绘制图形
在widget.cpp文件中对paintEvent()函数进行如下定义:

void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
//绘制线条
painter.drawLine(QPoint(0, 0), QPoint(100, 100));
}
这里先创建了—个QPainter 对象,使用了QPainter::QPainter(QPaintDevice *device)构造函数,并指定了this为绘图设备,即表明在该部件上进行绘制。使用这个构造函数创建的对象会立即开始在设备上绘制,自动调用begin()函数,然后在QPainter的析构函数中调用end()函数结束绘制。

如果在构建QPainter对象时不想指定绘制设备,那么可以使用不带参数的构造函数,然后使用QPainter:: begin (QPaintDevice *device)在开始绘制时指定绘制设备,等绘制完成后再调用end()函 数结束绘制。上面函数中的代码等价于:

QPainter painter;
painter.begin(this);
painter.drawLine(QPoint(0, 0), QPoint(100, 100));
painter.end();
这两种方式都可以完成绘制,无论使用哪种方式,都要指定绘图设备,否则将无法进行绘制。第二行代码使用drawLine()函数绘制了一条线段,这里使用了该函数的一种重载形式QPainter::drawLine ( const QPoint & p1, const QPoint & p2 )其中p1和p2分别是线段的起点和终点。这里的QPoint(0, 0)就是窗口的原点,默认是窗口的左上角(不包含标题栏)。效果如下图所示。

除了绘制简单的线条以外,QPainter中还提供了一些绘制其他常用图形的函数, 其中最常用的几个如下表所示。

函数 功能
drawArc() 绘制圆弧
drawChord() 绘制弦
drawConvexPolygon() 绘制凸多边形
drawEllipse() 绘制椭圆
drawLine() 绘制线条
drawPie() 绘制扇形
drawPoint() 绘制点
drawPolygon() 绘制多边形
drawPolyline() 绘制折线
drawRect() 绘制矩形
drawRoundedRect() 绘制圆角矩形
另外我们将光标定位到QPainter类名上,然后按下键盘上的F1按键,这时会自动跳转到该类的帮助页面。当然,也可以到帮助模式,直接索引查找该类名。在帮助里面我们可以看到很多相关的绘制函数,如下图所示。

我们任意点击一个函数名,就会跳转到该函数的介绍段落。例如我们点击drawEllipse()函数,就跳转到了该函数的介绍处,上面还提供了一个例子。如下图所示。我们可以直接将例子里面的代码复制到paintEvent()函数里面,测试效果。

1.2 使用画笔
QPen定义了用于QPainter应该怎样画线或者轮廓线。画笔具有样式style() 、宽度width() 、画刷brush() 、笔帽样式capStyle()和连接样式joinStyle()等属性。先介绍QPen类的构造函数:

QPen(const QBrush &brush, qreal width, Qt::PenStyle s = Qt::SolidLine,
Qt::PenCapStyle c = Qt::SquareCap, Qt::PenJoinStyle j = Qt::BevelJoin);
画刷brush()用于填充画笔所绘制的线条。
画笔的样式style()定义了线的样式。
笔帽样式capStyle()定义了使用QPainter绘制的线的末端;
连接样式joinStyle()则定义了两条线如何连接起来。
画笔宽度width()或widthF()定义了画笔的宽。注意,不存在宽度为 0 的线。假设你设置 width 为 0,QPainter依然会绘制出一条线,而这个线的宽度为 1 像素。
这么多参数既可以在构造时指定,也可以使用 set 函数指定,完全取决于你的习惯。使用setWidth(),setBrush(),setCapStyle()和setJoinStyle()函数可以轻松修改各种设置。

画笔样式

再将paintEvent()函数的内容更改如下:

void Widget::paintEvent(QPaintEvent *)
{
//创建画笔
QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
//使用画笔绘制圆弧
painter.setPen(pen);
QRectF rectangle(70.0, 40.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
painter.drawArc(rectangle, startAngle, spanAngle);
}
上面创建完画笔后,使用了setPen()来为painter设置画笔,然后使用画笔绘制了一个圆弧。绘制圆弧函数的一种重载形式为QPainter::drawArc ( const QRectF & rectangle, int startAngle, int spanAngle ),这里的三个参数分别对应于需要指定弧线所在的矩形、起始角度和跨越角度,如下图所示。

QRectF:: QRectF (qreal x, qreal y, qreal width, qreal height)可以使用浮点数为参数来确定一个矩形,它需要指定左上角的坐标(x,y)、宽width和髙height。如果只想使用整数来确定一个矩形,那么可以使用QRect类。这里角度的数值为实际度数乘以16,在时钟表盘中,0度指向3时的位置,角度数值为正则表示逆时针旋转,角度数值为负则表示顺时针旋转,整个一圈的数值为5760(即360X16)。

1.3 使用画刷
QBrush类提供了画刷来填充图形,一个画刷使用它的颜色和风格(例如它的填充模式)来定义。先介绍QBrush类的构造函数:

QBrush(const QColor &color, Qt::BrushStyle bs=Qt::SolidPattern);
在Qt中使用的颜色一般都由QColor类来表示,它支持RGB、HSV和CMYK等颜色模型。里面如果是三个参数,那么分别是红、绿、蓝分量的值,也就是经常说的rgb,取值范围都是0-255,比如这里的(255, 0, 0)就表明红色分量为255,其他分量为0,那么出来就是红色。如果是四个参数,最后一个参数alpha是设置透明度的,取值范围也是0-255,0表示完全透明,而255表示完全不透明。在Qt中还提供了20种预定义的颜色,如下图所示。

QBrush样式的填充模式使用Qt::BrushStyle枚举变量来定义,包含了基本模式填充、渐变填充和纹理填充,所有枚举变量如下图所示。默认的风格是Qt :: NoBrush(取决于你如何构建画笔),不填充形状。标准的填充风格是Qt :: SolidPattern。设置画刷风格的方式有两种,一种是利用构造函数,另外一种是利用setstyle函数。

再将paintEvent()函数的内容更改如下:

void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen; //画笔
pen.setColor(QColor(255, 0, 0));
QBrush brush(QColor(0, 255, 0, 125)); //画刷
painter.setPen(pen); //添加画笔
painter.setBrush(brush); //添加画刷
painter.drawRect(50, 50, 200, 100); //绘制矩形
}
这里分别新建了一个画笔QPen和画刷QBrush。其中画笔使用了setColor()函数为其设置了颜色,而画刷是在构建的时候直接为其设置的颜色。然后我们将画笔和画刷设置到了painter上,并使用drawRect()绘制了一个矩形,其左上角顶点在(50, 50),宽为200,高为100。运行程序,效果如下图所示。

回到顶部
二、渐变填充
在画刷中也可以使用渐变填充。QGradient类就是用来和QBrush一起指定渐变填充的。Qt现在支持三种类型的渐变填充:

线性渐变(linear gradient)在开始点和结束点之间插入颜色;
辐射渐变(radial gradient)在焦点和环绕它的圆环间插入颜色;
锥形渐变(Conical)在圆心周围插入颜色。
这三种渐变分别由QGradient的三个子类来表示,QLinearGradient表示线性渐变,QRadialGradient表示辐射渐变,QConicalGradient表示锥形渐变。

(1)线性渐变

QLinearGradient::QLinearGradient ( const QPointF & start, const QPointF & finalStop )
线性渐变需要指定开始点start和结束点finalStop,然后将开始点和结束 点之间的区域进行等分,开始点的位置为0.0,结束点的位置为1.0,它们之间的位置按照距离比例进行设定,然后使用
QGradient::setColorAt (qreal position, const QColorj &color)函数在指定的位置position插人指定的颜色color,当然,这里的position的值要在0〜1之间。

这里还可以使用setSpread()函数来设置填充的扩散方式,即指明在指定区域以外的区域怎样进行填充。扩散方式由QGradient::Spread枚举变量定义,它一共有3个 值,分别是QGradiem::PadSpread,使用最接近的颜色进行填充,这是默认值;QGradient:: ReflectSpread在渐变区域以外将反射渐变;QGradiem:: RepeatSpread在渐变区域以外的区域重复渐变。要使用渐变填充,可以直接在setBrush()中使用,这时画刷风格会自动设置为相对应的渐变填充。在线性渐变中这3种扩散方式的效果如下图所示。

img

(2)辐射渐变

QRadialGradient::QRadialGradient ( const QPointF & center, qreal radius, const QPointF & focalPoint )
辐射渐变需要指定圆心 center 和半径 radius,这样就确定 了一个圆,然后再指定一个焦点focalPoint。焦点的位置为0,圆环的位置为1,然后在焦点和圆环间插人颜色。辐射渐变也可以使用setSpread()函数设置渐变区域以外区域的扩散方式,3种扩散方式的效果如下图所示。

img

(3)锥形渐变

QConicalGradient::QConicalGradient ( const QPointF & center, qreal angle )
锥形渐变需要指定中心点center和一个角度angle(其值在0到360之间),然后沿逆时针从给定的角度开始环绕中心点插入颜色。这里给定的角度沿逆时针方向开始的位置为0,旋转一圈后为1。setSpread()函数对于锥形渐变没有效果。

(4)示例程序

示例程序如下:

void Widget::paintEvent(QPaintEvent *)
{
//线性渐变
QLinearGradient linearGradient(QPointF(40, 190),QPointF(70, 190));
//插入颜色
linearGradient.setColorAt(0, Qt::yellow);
linearGradient.setColorAt(0.5, Qt::red);
linearGradient.setColorAt(1, Qt::green);
//指定渐变区域以外的区域的扩散方式
linearGradient.setSpread(QGradient::RepeatSpread);
//使用渐变作为画刷
QPainter painter(this);
painter.setBrush(linearGradient);
painter.drawRect(100, 100, 90, 40);

//辐射渐变
QRadialGradient radialGradient(QPointF(100, 190),50,QPointF(275,200));
radialGradient.setColorAt(0, QColor(255, 255, 100, 150));
radialGradient.setColorAt(1, QColor(0, 0, 0, 50));
painter.setBrush(radialGradient);
painter.drawEllipse(QPointF(100, 200), 50, 50);

//锥形渐变
QConicalGradient conicalGradient(QPointF(250, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPointF(250, 200), 50, 50);

}
执行程序,效果如下:

img

13 对话框

分类
模态对话框
QDialog dlg(this)
dlg.exec();

非模态对话框

可以对其他窗口进行操作

为防止一闪而过,把dialog加到堆上

QDiaolg *dialog=new QDiaolg(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setWindowTitele(tr("hello"));
dialog->show;
标准对话框----消息对话框
  1. QMessageBox 静态成员函数 创建对话框
  2. 错误 信息 提问 警告
  3. 参数1 父亲 参数二 标题 参数三 显示内容 参数四 默认关联回车
  4. 返回值 StandardButton类型,利用返回值 来判断用户输入
其他标准对话框
  1. 颜色对话框 QColorDialog::getColor
  2. 文件对话框 QFileDialog::getOpenFileName(父亲,标题,默认路径,过滤文件)
  3. 字体对话框 QFontDialog::getFont


二 工具类

1 小功能

获取当前路径
QString str = QCoreApplication::applicationDirPath();
手写按钮

在窗口类中,如mainwindow中

新建一个按钮,然后 setparent(this) 再show 就能显示了

qt实现鼠标监测
1. 先在头文件声明 检测函数
2. 然后在cpp文件实现函数
3. 如果是鼠标移动监测的话,需要 先打开 centralWidget.setMouseTracking(true); 和 mainWindow的这个参数。
 ui->centralWidget->setMouseTracking(true);
 this->setMouseTracking(true);

在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent,但是MouseMoveEvent为了不太耗资源,默认状态下是要鼠标按下才能捕捉到。要想鼠标不按下时的移动也能捕捉到,需要setMouseTracking(true)。
QWidget中使用是没有问题的,但是,对于QMainWindow即使使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值