新建工程
新建工程选择有设计界面:
新建widget
右击工程名目录
选择<添加新文件>
在<选择一个模板>
界面选择Qt
,再选择Qt设计师界面类
,最后选择界面模板为Widget
设计自定义控件
在新添加的Widget界面中添加QSpinBox
和QSlider
,让两个控件任意其中一个改变另一个跟着改变。
通过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