参考代码
Q_OBJECT : 宏 定义了槽和信号的相关属性和方法
自定义窗口类
代码中myButton类是自定义按钮类,继承QPushButton类
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include "mybutton.h"
namespace selfSpace
{
class myWidget;
class myWidget : public QWidget
{
Q_OBJECT
public:
myWidget(QWidget *parent = 0);
myWidget(QWidget *parent,int w,int h);
~myWidget();
private:
void connectButton(void);
void buttonMake(void);
myButton* b1;
myButton* b2;
};
} //namespace selfSpace
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include "mybutton.h"
namespace selfSpace
{
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
buttonMake();
b1->move(540,580);
b2->move(0,0);
this->resize(600,600);
connectButton();
}
myWidget::myWidget(QWidget *parent, int w, int h)
: QWidget(parent)
{
this->resize(w,h);
buttonMake();
b2->move(w-60,h-20);
connectButton();
}
void myWidget::connectButton()
{
//connect -> 信号与槽的链接函数,一个模板函数
//connect(信号来源(sender),信号(single),this(接收信号的对象),信号处理函数(槽slot),类型(type,默认赋值QT::AutoConnection));
connect(b1,myButton::clicked,this,myWidget::close);
//myButton::clicked -> 函数指针 继承QPushButton的方法
//myWidget::close -> 函数指针 ,继承与QWidget
}
void myWidget::buttonMake(void)
{
b1 = new myButton(this);
b2 = new myButton(this);
b1->setText("Button1");
b2->setText("Button2");
b1->resize(60,20);
b2->resize(60,20);
}
myWidget::~myWidget()
{
delete b1;
delete b2;
}
} //namespace selfSpace
自定义按钮类
继承QPushButton类
mybutton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QPushButton> //继承了QWidget类
namespace selfSpace
{
class myButton;
class myButton : public QPushButton
{
Q_OBJECT
public:
myButton(QWidget*paret = 0);
~myButton();
};
}
#endif // MYBUTTON_H
mybutton.cpp
#include "mybutton.h"
namespace selfSpace
{
myButton::myButton(QWidget*parent) : QPushButton(parent)
{
}
myButton::~myButton()
{
}
} //namespace selfSpace
自定义槽函数
自定义槽函数声明
class mainPage : public QWidget
{
Q_OBJECT
public:
mainPage(QWidget *parent = 0);
~mainPage();
/***********************槽函数*****************************/
//槽函数可以有参数,可以被重载!!
public slots: //public slots: -> 允许与任何信号连接
void Slot_a(void);
private slots: //private slots: -> 只允许类中的信号与槽连接
void Slot_b(void);
};
自定义信号
class subPage : public QWidget
{
Q_OBJECT
public:
subPage(QWidget *parent = 0);
~subPage();
public slots:
void Slot_b1Down();
signals: //信号函数必须要用signals:
void Signal_b1Down(); //信号函数不能有返回值,不需要函数的实现!!
};
//可以使用 emit Signal_name();发送信号
自定义信号重载
声明
signals:
void Signal_b1Down();
void Signal_b1Down(int,QString);
连接
//对于重载的信号,可以使用强制类型转换来告诉编译器使用的是哪个信号!! 函数指针!!
// 返回值 (域名::*)(参数1,参数2,...)
connect(subP,(void(subPage::*)())subPage::Signal_b1Down,this,Slot_ShowMain);
connect(subP,(void(subPage::*)(int,QString))subPage::Signal_b1Down,this,Slot_Qdebug);
//上面是QT5 版本的连接函数
//以下使用QT4版本的连接函数
//SIGNAL & SLOT ---> 宏,将函数名转换为字符串,然后由编译器在类中查找对应函数
//相比于QT5 它不需要在函数名前加入域名
//connect(subP,SIGNAL(Signal_b1Down()),this,SLOT(Slot_ShowMain()));
//connect(subP,SIGNAL(Signal_b1Down(int,QString)),this,SLOT(Slot_Qdebug(int,QString)));
QT中常用API函数
connect()
槽与信号的关联函数
//connect -> 信号与槽的链接函数,一个模板函数
//connect(信号来源(sender),信号(single),this(接收信号的对象),信号处理函数(槽slot),类型(type,默认赋值QT::AutoConnection));
//QPushButton::clicked -> 函数指针
//myWidget::close -> 函数指针 ,继承与QWidget
connect(b1,QPushButton::clicked,this,myWidget::close);
//对于自定义的槽函数,槽函数的参数要与信号函数参数一致!!
//自定义槽函数可以是全局函数,类方法,静态函数,lamda表达式
connect(b2,QPushButton::clicked,this,myWidget::ResetName);
//QT4:
//SIGNAL & SLOT ---> 宏,将函数名转换为字符串,然后由编译器在类中查找对应函数
//相比于QT5 它不需要在函数名前加入域名
//这种连接方式不具备监测能力!!不推荐
connect(subP,SIGNAL(Signal_b1Down()),this,SLOT(Slot_ShowMain()));
connect(subP,SIGNAL(Signal_b1Down(int,QString)),this,SLOT(Slot_Qdebug(int,QString)));
UI结构
Ui::MainWindow != MainWindow
Ui::MainWindow继承Ui_MainWindow (默认纯继承)
Ui::MainWindow.h会将mainwindow.ui中的图形转化为C++语言!
class Ui_MainWindow
{
public:
//根据ui文件中的构件生成对应实例
QWidget *centralWidget;
QPushButton *pushButton;
QPushButton *pushButton_2;
QMenuBar *menuBar;
QToolBar *mainToolBar;
QStatusBar *statusBar;
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(400, 300);
centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
pushButton = new QPushButton(centralWidget);
pushButton->setObjectName(QStringLiteral("pushButton"));
pushButton->setGeometry(QRect(120, 120, 80, 20));
pushButton_2 = new QPushButton(centralWidget);
pushButton_2->setObjectName(QStringLiteral("pushButton_2"));
pushButton_2->setGeometry(QRect(230, 180, 80, 20));
MainWindow->setCentralWidget(centralWidget);
menuBar = new QMenuBar(MainWindow);
menuBar->setObjectName(QStringLiteral("menuBar"));
menuBar->setGeometry(QRect(0, 0, 400, 22));
MainWindow->setMenuBar(menuBar);
mainToolBar = new QToolBar(MainWindow);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
statusBar = new QStatusBar(MainWindow);
statusBar->setObjectName(QStringLiteral("statusBar"));
MainWindow->setStatusBar(statusBar);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", Q_NULLPTR));
pushButton->setText(QApplication::translate("MainWindow", "aaa", Q_NULLPTR));
pushButton_2->setText(QApplication::translate("MainWindow", "sadasd", Q_NULLPTR));
} // retranslateUi
};
串口模块
QT += serialport
QList<QSerialPortInfo> Usart::GetSerialPortList()
{
PortCount = QSerialPortInfo::availablePorts().length(); //获取可连接的com口
//foreach(variables ,container)
//qt对c++的拓展 按顺序遍历container容器中的variable项
//QSerialPortInfo::availablePorts() 静态方法 返回QList<QSerialPortInfo> 即QSerialPortInfo的列表
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
qDebug()<<info.portName()<<info.description();
}
qDebug()<<PortCount;
return QSerialPortInfo::availablePorts();
}
QObject
|