QT学习笔记—自定义控件

新建工程

新建工程选择有设计界面:
在这里插入图片描述

新建widget

右击工程名目录选择<添加新文件>

<选择一个模板>界面选择Qt,再选择Qt设计师界面类,最后选择界面模板为Widget
在这里插入图片描述

设计自定义控件

在新添加的Widget界面中添加QSpinBoxQSlider,让两个控件任意其中一个改变另一个跟着改变。
在这里插入图片描述
通过Qt助手查看可知两个控件有如下信号和槽:
在这里插入图片描述
在这里插入图片描述
在widget的构造函数中添加代码:

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

    //信号和槽有重载,使用函数指针指定信号和槽
    void (QSpinBox:: *spinSignal)(int) = &QSpinBox::valueChanged;
    void (QSlider:: *sliderSlot)(int) = &QSlider::setValue;
    connect(ui->spinBox, spinSignal, ui->horizontalSlider, sliderSlot); //设置信号和槽 spinBox改变slider跟着改变

    void (QSlider:: *sliderSignal)(int) = &QSlider::valueChanged;
    void (QSpinBox:: *spinSlot)(int) = &QSpinBox::setValue;
    connect(ui->horizontalSlider, sliderSignal, ui->spinBox, spinSlot);//设置信号和槽 slider改变SpinBox跟着改变
}

提供对外public接口获取和改变新定义控制的值:

class myNewWidget : public QWidget
{
    
    
    Q_OBJECT

public:
    explicit myNewWidget(QWidget *parent = 0);
    ~myNewWidget();

public:
    void setNum(int);
    int getNum(void);

private:
    Ui::myNewWidget *ui;
};

void myNewWidget::setNum(int val)
{
    
    
    ui->spinBox->setValue(val);
}

int myNewWidget::getNum(void)
{
    
    
    return ui->horizontalSlider->value();
}

测试自定义控件

在主界面添加一个widget和连个PushButton:
在这里插入图片描述
右键widget选择<提升为>,在<提升的类名称>填入自定义控件的类名,点击<添加>
这种该操作能成功的前提是自定义控件必须继承自Qwidget,也就是自定义控件的父亲必须是要提升的控件。
在这里插入图片描述
测试代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

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

    setWindowTitle(tr("自定义控件"));

    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::SetNewWidgetHalf);
    connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::getNewWidgetValue);
}

void MainWindow::SetNewWidgetHalf()
{
    
    
    ui->widget->setNum(50);
}

void MainWindow::getNewWidgetValue()
{
    
    
    qDebug() << "获取数值:" << ui->widget->getNum();
}

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

在这里插入图片描述


遇到了qDebug不能输出的问题

解决办法:
https://blog.csdn.net/cgzhello1/article/details/19916231

猜你喜欢

转载自blog.csdn.net/qq_36413982/article/details/107855258