加载本地图片

/* QPixmap类型对象 */

QPixmap image;
/* 加载 */
image.load(":/image/cd.png");


//不缩放
ui->label->setScaledContents(false);
// 图片在标签中居中显示(水平和垂直方向均居中)
ui->label->setAlignment(Qt::AlignCenter);

    pixbad2(":/1/bad.png");
    pixbad1(":/1/bad2.png");
    ui->labelBad->setPixmap(pixbad1);
    ui->labelBad->setScaledContents(false);
    ui->labelBad->setAlignment(Qt::AlignCenter);

信号和槽

信号可以是一个函数,(感觉经常就是一个函数)

信号只有声明,无执行,可传参给槽

相较于直接在发信号处调用槽,因为connect()的存在,信号和槽的组合更加灵活

如下

public:
    WorkerThread(QWidget *parent = nullptr) {
        Q_UNUSED(parent);
    }

    /* 重写run方法,继承QThread的类,只有run方法是在新的线程里 */
    void run() override {
        QString result = "线程开启成功";

        /* 这里写上比较耗时的操作 */
        // ...
        // 延时2s,把延时2s当作耗时操作
        sleep(2);

        /* 发送结果准备好的信号 */
        //执行
        emit resultReady(result);
    }

signals:
    /* 声明一个信号,译结果准确好的信号 */
	//声明
    void resultReady(const QString &s);

或者类似返回值的感觉

例如某个操作会触发某个类的某个函数,这个函数(发送返回值??)即可以是信号、

发送信号,emit关键字

emit resultReady(result);

信号和槽之间还能传递参数,QString

connect(workerThread, SIGNAL(resultReady(QString)),this, SLOT(handleResults(QString)));//信号和槽之间还能传递参数

进程的创建

分两种,一种直接继承 QThread 类编写run()

另一种是继承 QObject 类。继承 QObject 类更加灵活。它通过 QObject::moveToThread()方法,将一个 QObeject 的类转移到一个线程里执行。仍需要一个QThread的类管理线程

关于布局

控件加入QHBoxLayout(水平),控件合集

    /* 水平布局一添加内容 */
    hBoxLayout[0]->addWidget(pushButton[0]);
    hBoxLayout[0]->addWidget(pushButton[1]);
    hBoxLayout[0]->addWidget(pushButton[2]);

再将QHBoxLayout保存在一个窗口hWidget,控件合集的合集,

hWidget[0]->setLayout(hBoxLayout[0]);

其他示例

    /* 水平布局二添加内容 */
    hBoxLayout[1]->addWidget(label[0]);
    hBoxLayout[1]->addWidget(comboBox);
    hBoxLayout[1]->addWidget(label[1]);
    hBoxLayout[1]->addWidget(spinBox);

    /* 设置水平容器二的布局为水平布局二 */
    hWidget[1]->setLayout(hBoxLayout[1]);

可被其他窗口包含,本质上也算是一个大控件

    /* 垂直布局添加内容 */
    vBoxLayout->addWidget(textBrowser);
    vBoxLayout->addWidget(hWidget[1]);
    vBoxLayout->addWidget(hWidget[0]);
    vBoxLayout->addWidget(hWidget[2]);

	vWidget->setLayout(vBoxLayout);

最后设置主显示(窗口):vWidget

/* 居中显示 */
setCentralWidget(vWidget);

TCP通信

复杂,,,,以后复制的函数能用就好了

调用提供的API函数,每一个动作都有特定的(约定俗成的)处理方法

image-20240125032843574

图,,

image-20240125050715263

image-20240125060526882

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

QT_CREAT后台启动

/opt/Qt5.12.9/Tools/QtCreator/bin/qtcreator.sh &
100ASK_IMX6ULL_PRO
屏幕左上角的光标操作
关闭光标
echo -e "\033[?25l" > /dev/tty1

打开光标
echo -e "\033[?25h"  > /dev/tty1
让屏幕不自动熄灭
echo -e  "\033[9;0]"  > /dev/tty0
去掉Qt界面(米尔HMI界面)
mv /etc/init.d/S99myirhmi  ~
去掉lvgl界面
*主要看自己/etc/init.d 下面有哪些文件*
mv /etc/init.d/S05lvg  ~
或
mv /etc/init.d/S32lvgl  ~
或
mv /etc/init.d/S49lvgl  ~
修改打印等级
echo 4 >/proc/sys/kernel/printk

image-20240126100659124

image-20240126100925257

开机脚本

/etc/init.d/rcS

Qt群里行人稀,常有车手较高低,如今车道依旧在,不见当年老司机。

知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究。

image-20240130011941130

image-20240130012856529

QT_部署

/* 获取屏幕的分辨率,Qt官方建议使用这
        * 种方法获取屏幕分辨率,防上多屏设备导致对应不上
        * 注意,这是获取整个桌面系统的分辨率
        */
    QList <QScreen *> list_screen =  QGuiApplication::screens();

    /* 如果是ARM平台,直接设置大小为屏幕的大小 */
#if __arm__
    /* 重设大小 */
    this->resize(list_screen.at(0)->geometry().width(),
                 list_screen.at(0)->geometry().height());
    /* 默认是出厂系统的LED心跳的触发方式,想要控制LED,
        * 需要改变LED的触发方式,改为none,即无 */
    //system("echo none > /sys/class/leds/sys-led/trigger");
#else
    /* 否则则设置主窗体大小为800x480 */
    this->resize(1024, 600);
#endif

QT触摸屏配置

设备信息

image-20240204133422618

配置

export QT_LOGGING_RULES=qt.qpa.input=true # 打印触屏信息
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event1 # 指定输入设备的名称
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event1 # 将触摸屏的点击事件配置成Qt的鼠标点击事件
export QT_QPA_FB_HIDECURSOR=1 # 为1则隐藏鼠标光标,为0则显示鼠标光标
#TSLIB
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_FBDEVICE=/dev/fb0

#Qt
export QT_QPA_EGLFS_DISABLE_INPUT=1
export QT_QPA_GENERIC_PLUGINS="tslib:/dev/input/event1"
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/plugins
export QT_QPA_PLATFORM=eglfs
export QML2_IMPORT_PATH=/usr/lib/qml
export QT_QPA_EGLFS_TSLIB=1

GIF动画

QMovie *movie = new QMovie(":/1/shuaidao.gif");
    ui->label_5->setMovie(movie);
    ui->label_5->setScaledContents(true);
    ui->label_5->setAlignment(Qt::AlignCenter);
    // GIF 动画执行一次就结束
    connect(movie, &QMovie::frameChanged, [=](int frameNumber){
    if (frameNumber == movie->frameCount() - 1){movie->stop();}});
    movie->start();