代码编织梦想

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Widget w;
    w.show();

    return a.exec();
}

widget.h

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
	// 为使用 信号槽,必须定义这个宏
    Q_OBJECT

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

private:
    Ui::Widget *ui;
};

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

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

widget.ui

添加一个 Label 和 一个 PushButton
在这里插入图片描述

ui_widget.h

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Widget
{
public:
    QLabel *LabDemo;
    QPushButton *btnClose;

    void setupUi(QWidget *Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName(QStringLiteral("Widget"));
        Widget->resize(400, 300);

        LabDemo = new QLabel(Widget);
        LabDemo->setObjectName(QStringLiteral("LabDemo"));
        // Geometry几何(即大小)
        LabDemo->setGeometry(QRect(70, 92, 81, 20));

        btnClose = new QPushButton(Widget);
        btnClose->setObjectName(QStringLiteral("btnClose"));
        btnClose->setGeometry(QRect(240, 90, 75, 23));

        // 设置 Widget的WindowTitle、LabDemo的Text、btnClose的Text
        retranslateUi(Widget);
        
        // 设置 信号槽
        QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));
        // 设置槽函数的关联方式,用于将UI设计器自动生成的组件信号的槽函数与组件信号相关联
        QMetaObject::connectSlotsByName(Widget);
    } // setupUi

    void retranslateUi(QWidget *Widget)
    {
        Widget->setWindowTitle(QApplication::translate("Widget", "My First Demo", Q_NULLPTR));
        LabDemo->setText(QApplication::translate("Widget", "Hello World", Q_NULLPTR));
        btnClose->setText(QApplication::translate("Widget", "Close", Q_NULLPTR));
    } // retranslateUi

};

namespace Ui {
    class Widget: public Ui_Widget {};
} // namespace Ui

QT_END_NAMESPACE


简要说明:


Widget类 继承 QWidget,private包含一个 Ui::Widget* 指针对象 ui

Widget类构造时:
	先调用 父类QWidget的构造函数,
	再 new一个 Ui::Widget对象实例化 ui,
	最后调用 ui->setupUi(this),实际调用 Ui_Widget::setupUi(QWidget *Widget)
		
	
	Ui_Widget
	
ui_widget.h 中 定义类 Ui::Widget,其继承自 Ui_Widget 

	namespace Ui 
	{
		class Widget: public Ui_Widget {};
	}

继承关系

QLabel : public QFrame
	QFrame : public QWidget
		QWidget : public QObject

对应UI 设计器:
在这里插入图片描述

QPushButton : public QAbstractButton
	QAbstractButton : public QWidget
		QWidget : public QObject

对应UI设计器:
在这里插入图片描述

信号槽函数

static QMetaObject::Connection connect(
					const QObject *sender, const char *signal,
					const QObject *receiver, const char *member, 
					Qt::ConnectionType = Qt::AutoConnection);

static QMetaObject::Connection connect(
					const QObject *sender, const QMetaMethod &signal,
					const QObject *receiver, const QMetaMethod &method,
					Qt::ConnectionType type = Qt::AutoConnection);

inline QMetaObject::Connection connect(
					const QObject *sender, const char *signal,
					const char *member, 
					Qt::ConnectionType type = Qt::AutoConnection) const;
					
template <typename Func1, typename Func2>
static inline QMetaObject::Connection connect(
					const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
					const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot,
					Qt::ConnectionType type = Qt::AutoConnection)					
					
					
					
					
//connect to a function pointer  (not a member)
template <typename Func1, typename Func2>
static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0, QMetaObject::Connection>::type
		connect(
					const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, 
					Func2 slot)					
{       }
				
					
					
//connect to a function pointer  (not a member)
template <typename Func1, typename Func2>
static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0 &&
									  !QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction, QMetaObject::Connection>::type
		connect(
					const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, 
					const QObject *context, Func2 slot,
					Qt::ConnectionType type = Qt::AutoConnection)
{					}
					
	

//connect to a functor
template <typename Func1, typename Func2>
static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::type
		connect(
					const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, 
					Func2 slot)
{		}



//connect to a functor, with a "context" object defining in which event loop is going to be executed
template <typename Func1, typename Func2>
static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::type
		connect(
					const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, 
					const QObject *context, Func2 slot,
					Qt::ConnectionType type = Qt::AutoConnection)
{		}





// 实际调用第3个函数
inline QMetaObject::Connection QObject::connect(
					const QObject *asender, const char *asignal,
                    const char *amember, 
					Qt::ConnectionType atype) const
{ return connect(asender, asignal, this, amember, atype); }
	
    // internal slot-name based connect
    static void connectSlotsByName(QObject *o);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/a731062834/article/details/110922236

thrift JAVA使用示例(可与C++/QT互相访问)-爱代码爱编程

thrift JAVA使用示例(可与C++/QT互相访问) JAVA客户端、服务器端/QT客户端、服务器端 接 上一篇文章 搭建C++的thrift环境之后,本文继续实现thrift的JAVA服务器端和客户端,thrift仍然使用上一篇使用的add.thrift。 //add.thrift //a + b service AddService{

基于QT的CAN通讯数据实时波形显示(连载八)====“子函数或新类调用ui控件”-爱代码爱编程

前言     主程序里数据传输到新的类里(这里是线程,其他类似)后,需要在里面绘图,这样就需要调用ui界面的控件。网上搜寻到很多方法,都一一试验,但是都没有办法完美的实现,不是这里错,就是那里错。所以有点怀疑是不是自己用了一个假的QT,为啥,不知道,就是参照他们的方法出不来。和高手讨论并且结合网上的例子,搞出来一个可以解决的方法,很好用,并且和上文中的方

QT creator学习 | 代码中有中文运行乱码or常量中有换行符解决方案-爱代码爱编程

(一)问题背景 使用QT Creator写代码时,有时候要让显示的界面有中文显示,这时候编译出现了乱码。比如: 或者编译时提示常量中有换行符 网上搜了一些资料整理一下解决方案叭 (二)解决方案 1.设置文本编辑器 打开一个项目,工具→选项→文本编辑器,在文本编辑器界面的文本编码地方选择 然后选择文本编辑器中的Behavior, 选择默认编码选项

记录QTcpSocket碰到的ConnectToHost失败问题-爱代码爱编程

之前尝试Qt的QTcpSocket,发现ConnectToHost失败,waitForConnected一直返回false,一直不得其解,放弃了。直到最近再次使用,仍然是返回false,下定决心要解决这个问题。 心血来潮查了QT的文档,发现有个Proxy,心里突然一激动,点开文档进去有个QNetworkProxy。 看文档发现代理种类很多,平时默认走Def

QT中Trackball的实现-爱代码爱编程

Trackball,又叫轨迹球。其主要功能是用于将屏幕上的二维操作,转换到三维坐标系下的数据。 其主要是使用利用圆的方程,求出Z的位置。 在QT的源码中,也发现Trackball 相关的代码,如下: Qt5.6.0\Examples\Qt-5.6\qtbase\widgets\graphicsview\boxes\trackball.cpp #incl

QSS编辑器—实时预览 语法提示 颜色拾取-爱代码爱编程

桌面应用Qt widgets是最好选择之一。尤其是不使用C#、vb等语言编写应用程序时。使用qss可以用类似css的方式美化Qt widgets界面,方法简单,效果也很漂亮。 但是目前并没有很好用的Qss编辑器。网上搜了一下 ,知名的qss编辑器QssEditor、Rizek Qss Editor等功能都不是很完善,QssEditor控件很少,不支持语法