QT

1  界面布局

  • 实现登录窗口
  • 利用布局方式,给窗口类化
  • 选取Widget进行布局,水平布局,垂直布局,栅格布局
  • 给用户名、密码、登录、退出按钮进行布局
  • 默认窗口和控件之间有9间隙,可以调整layoutLeftMargin
  • 利用弹簧进行布局

2  控件

  • 按钮组

          1)      QPushButton 常用按钮

          2)      QToolButton  工具按钮  用于显示图片 文字  修改风格等等

          3)      toolButtonStyle 凸起风格   autoRaise

          4)      radioButton 单选按钮, 设为默认

          5)      checkbox 多选按钮 监听状态 2 选中 1半选 0 未选

          6)      

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QRadioButton>
#include <QListWidgetItem>

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

    //设置单选按钮, 默认选择男
    ui->rbtman->setChecked(true);
    //选择女,打印信息
    connect(ui->rbtwomen,&QRadioButton::clicked,[=](){
        qDebug()<<"选择女";
    });

    //多选按钮
    connect(ui->ck_1,&QCheckBox::stateChanged,[=](int state){
         qDebug()<<state;
    });


}

  • QListWidget  列表容器

          1)      QListWigetItem *Item  一行内容

          2)      ui->listWidget->additem(item)

          3)      设置居中方式 item->setTextAlignment(Qt::AlignHCenter);

          4)      可以利用 additems 一次性添加所有内容

          5)      

//    ListWidget
//    QListWidgetItem *Item = new QListWidgetItem("锄头日当午");
//    ui->listWidget->addItem(Item);
//    Item->setTextAlignment(Qt::AlignHCenter);

    QStringList list;
    list<<"锄禾日当午"<<"汗滴禾下土"<<"谁知盘中餐"<<"粒粒皆辛苦";
    ui->listWidget->addItems(list);
  • 其他控件介绍

          1)      stackedWidget  栈控件

                   ui->stackedWidget->setCurrentIndex(1);

          2)      下拉框

                   ui->comboxBox->additem(“ABC”);

          3)      QLabel 显示图片

                   ui->lbl_Image->setPixmap(QPixmap(“:/Image/panda.png”));

          4)      QLabel 显示动图

                    ui->lbl_movie->setMovie(movie);

                    movie->start();

          5)      TableWidget控件的代码使用         

    //设置列数
    ui->tableWidget->setColumnCount(3);
    //设置行数
    ui->tableWidget->setRowCount(5);
    //设置水平表头
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
    //设置正文
    //   ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));
    QStringList nameList;
    nameList<<"亚瑟"<<"张飞"<<"关羽"<<"刘备"<<"花木兰";
    QList<QString> setList;
    setList<<""<<""<<""<<""<<"";

    for(int i=0;i<5;i++)
    {
        int col = 0;
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(setList.at(i)));
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18)));

    }

效果:

3. 自定义控件

  • 添加新文件 – Qt – 设计师界面类 (.h .cpp .ui)
  • ui中设计 QSpinBox和 QSlider 两个控件
  • Widget中使用自定义控件, 拖着一个Widget,点击提升为, 点击添加,点击提升
  • 实现功能,改变数字,滑动条跟着移动,信号槽监听
  • 提供getNum和setNum 对外接口
  • 测试接口
SmallWidget.cpp
#include "smallwidget.h"
#include "ui_smallwidget.h"
#include <QSpinBox>
#include <QSlider>

SmallWidget::SmallWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SmallWidget)
{
    ui->setupUi(this);
    //QSpinBox 移动  QSlider移动

    void (QSpinBox:: *spSignal)(int) = &QSpinBox::valueChanged;
    connect(ui->spinBox, spSignal,ui->horizontalSlider, &QSlider::setValue);

    //QSlider滑动  QSpinBox数字跟着改变
    connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);

}

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

int SmallWidget::getnum()
{
    return ui->spinBox->value();
}

void SmallWidget::setnum(int num)
{
    ui->spinBox->setValue(num);
}
SmallWidget.h
#ifndef SMALLWIDGET_H
#define SMALLWIDGET_H

#include <QWidget>

namespace Ui {
class SmallWidget;
}

class SmallWidget : public QWidget
{
    Q_OBJECT

public:
    explicit SmallWidget(QWidget *parent = nullptr);
    ~SmallWidget();

    void setnum(int num);
    int getnum();

private:
    Ui::SmallWidget *ui;
};

#endif // SMALLWIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //获取值
    connect(ui->btn_1,&QPushButton::clicked,[=](){
        qDebug()<<ui->widget->getnum();
    });

    //设置值
    connect(ui->btn_2,&QPushButton::clicked,[=](){
        ui->widget->setnum(50);
    });
}

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

4. Qt中的事件

  • 鼠标事件
  • 鼠标进入事件  enterEvent
  • 鼠标离开事件  leaveEvent
  • 鼠标按下  mousePressEvent(QMouseEvent *ev)
  • 鼠标释放  mouseReleaseEvent
  • 鼠标移动  mouseMoveEvent
  • ev->x()  x坐标  ev->y()  y坐标
  • ev->button() 判断鼠标左右按键  Qt::LeftButton  Qt::RightButton
  • ev->buttons() 判断组合按键 判断move时候的左右键 结合 & 操作符
  • 格式化字符串 QString(“%1  %2”).arg(111).arg(222)

myLabel.cpp

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    //设置鼠标追踪状态
    setMouseTracking(true);  //没有这个api的话,鼠标移动时将不会触发mousemoveEvent事件
}

void MyLabel::enterEvent(QEvent *event)
{
    qDebug()<<"鼠标进入";
}

void MyLabel::leaveEvent(QEvent *)
{
    qDebug()<<"鼠标离开";
}

void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton)
    {
        QString str = QString("鼠标按下了 x = %1  y = %2 globalX = %3  globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }
}

void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
 //   if(ev->buttons() &Qt::LeftButton)
 //   {
        QString str = QString("鼠标移动了 x = %1  y = %2 globalX = %3  globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
 //   }

}

myLabel.h

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);

    //鼠标进入
    void enterEvent(QEvent*event);

    //鼠标离开
    void leaveEvent(QEvent*);

    //鼠标按下
    void mousePressEvent(QMouseEvent *);

    //鼠标移动
    void mouseMoveEvent(QMouseEvent *ev);

signals:

};

#endif // MYLABEL_H

5. 定时器1

  • 利用事件 void timerEvent(QTimerEvent *ev)
  • 启动定时器  startTimer(1000) 毫秒单位
  • timerEvent 的返回值是定时器的唯一标志 可以和ev->timerid 来做比较

6. 定时器2

  • 利用定时器类 QTimer
  • 创建定时器对象 QTimer *timer = new QTimer(this);
  • 启动定时器 timer->start(毫秒)
  • 每隔一定毫秒,发送信号 timeout,进行监听
  • 暂停 timer->stop()

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>

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

    id1= startTimer(1000);
    id2 = startTimer(2000);

    //第二种定时器的方法
    QTimer *timer = new QTimer();
    timer->start(500);
    connect(timer,&QTimer::timeout,[=](){
        static int num2 = 1;
        ui->label_4->setText(QString::number(num2++));
    });

    connect(ui->btn, &QPushButton::clicked,[=](){
        timer->stop();
    });
}

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

void Widget::timerEvent(QTimerEvent *ev)
{
    static int num = 1;
    static int num1 = 1;
    if(ev->timerId() == id1)
    {
        ui->label_2->setText(QString::number(num++));
    }
    if(ev->timerId() == id2)
    {
        ui->label_3->setText(QString::number(num1++));
    }
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void timerEvent(QTimerEvent *);
    int id1;
    int id2;

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

效果:

原文地址:https://www.cnblogs.com/strive-sun/p/14579482.html