Qt学习笔记

2023-10-30

1.Qt(音同 cute)

是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。

2.Qt的安装

http://c.biancheng.net/view/3858.html

3.Qt的安装目录

在这里插入图片描述

4.main.cpp文件讲解

在这里插入图片描述
1~2 行:由于 main() 函数中分别定义了 QApplication 和 MainWindow 类的对象,因此需要引入 mainwindows.h 和 QApplication 头文件。mainwindow.h 文件是我们自己创建的,引入时用" "双引号括起来;QApplication 是 Qt 提供给我们的,引入时用<>括起来。
第 7 行:MainWindow 是自定义的类,继承自 QMainWindow 主窗口类,因此 MainWindow 也是一个主窗口类。w 是 MainWindow 类实例化出的对象,表示一个主窗口
第 8 行:默认情况下,Qt 提供的所有组件(控件、部件)都是隐藏的,不会自动显示。通过调用 MainWindow 类提供的 show() 方法,w 窗口就可以在程序运行后显示出来。

5.mainwindow.h文件讲解

在这里插入图片描述
初始状态下,MainWindow 类由 Q_OBJECT、构造函数和析构函数组成,这里重点介绍一下 Q_OBJECT 和构造函数:
Q_OBJECT:本质是一个已定义好的宏,所有需要“信号和槽”功能的组件都必须将 Q_OBJECT 作为 private 属性成员引入到类中。
带参的构造函数:QWidget 是所有组件的基类,借助 parent 指针,可以为当前窗口指定父窗口。

下面是 视频链接https://www.bilibili.com/video/BV1N34y1H7x7的笔记,

6 widget.h文件讲解

在这里插入图片描述

7widget.cpp文件讲解

在这里插入图片描述

8信号和槽

连接信号和槽的四种方式
注意:
1)信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。
2)使用信号和槽的类中,必须在类的定义中加入宏Q_OBJECT

1.鼠标放在组件上点击右键,选到槽,选择信号
widget.h文件中增加了:

private slots:
    void on_commitPushButton_clicked();

widget.cpp文件中增加了

void Widget::on_commitPushButton_clicked()
{
}

然后需要手动补充函数:实现获取输入框的内容,并打开输入的软件

//widget.h中:
#include<QProcess>

//widget.cpp中补充函数on_commitPushButton_clicked(),
void Widget::on_commitPushButton_clicked()
{
    //获取lineEdit数据 访问界面数据
    QString program=ui->cmdLineEdit->text();
    //创建process对象
    QProcess *myProcess = new QProcess(this);
    myProcess->start(program);
}

点击运行
2.使用connect连接信号和槽4个参数 谁发出 发出啥 谁处理 怎么处理

//按下回车键执行槽函数
connect(ui->cmdLineEdit,SIGNAL(returnPressed()),this,SLOT(on_commitPushButton_clicked()));

3.使用connect连接信号和槽4个参数 &符号 自动填充

//前提:需要去widget.h文件中声明函数名,在widget.cpp文件中实现槽函数也就是方法一种自动添加的两部分类似
void on_cancelPushButton_clicked();//widget.h
void Widget::on_cancelPushButton_clicked()//widget.cpp
{
    this->close();//关闭窗口
}
//点击取消键执行槽函数
connect(ui->cancelPushButton,&QPushButton::clicked,this,&Widget::on_cancelPushButton_clicked);

4.使用connect连接信号和槽3个参数 当操作内容较少时,不使用处理函数

//前提:QMessageBox要在widget.h文件中声明#include<QMessageBox>
//点击浏览键,弹出信息
 connect(ui->browsepushButton,&QPushButton::clicked,[this]()
    {
        QMessageBox::information(this,"信息","点击浏览");
    });

总结widget.cpp文件:

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

//构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //connect连接信号和操 谁发出 发出啥 谁处理 怎么处理
    connect(ui->cmdLineEdit,SIGNAL(returnPressed()),this,SLOT(on_commitPushButton_clicked()));
    //&符号
    connect(ui->cancelPushButton,&QPushButton::clicked,this,&Widget::on_cancelPushButton_clicked);
    //不使用槽函数
    connect(ui->browsepushButton,&QPushButton::clicked,[this]()
    {
        QMessageBox::information(this,"信息","点击浏览");
    });
}
//析构函数
Widget::~Widget()
{
    delete ui;
}

void Widget::on_commitPushButton_clicked()
{
    //获取lineEdit数据 访问界面数据
    QString program=ui->cmdLineEdit->text();
    //创建process对象
    QProcess *myProcess = new QProcess(this);
    myProcess->start(program);
}
void Widget::on_cancelPushButton_clicked()
{
    this->close();//关闭窗口
}



9四则运算计算器的实现

1)网格的应用
2)信号和槽
3)在按钮上放图片,改变按钮背景颜色

//wedget.cpp
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //按钮上放图片
    QIcon con("E:\\22cqqCode\\QtCode\\calculate\\1.png");
    ui->backButton->setIcon(con);

    //改变按钮的背景色
    ui->equalButton->setStyleSheet("background:blue");
}

4)QString 和char *的转换

//把QString转换成char *
QByteArray byteArray;
byteArray.append(expression);//QString->QByteArray
strcpy(opt,byteArray.data());//QByteArray->QString

5)栈的应用QStack 用stack实现四则运算https://blog.csdn.net/qq_63844103/article/details/123875163

void Widget::on_equalButton_clicked()
{
    QStack<int> s_num;
    QStack<char> s_opt;

    char opt[128]={0};
    int i=0,tmp=0,num1,num2;
    //把QString转换成char *
    QByteArray byteArray;
    byteArray.append(expression);//QString->QByteArray
    strcpy(opt,byteArray.data());//QByteArray->QString

    /*四则运算用栈实现
     * 将中缀表达式转为后缀表达式->计算后缀表达式
     * 1.数字(直接入栈s_num)
     * 2.运算符(s_opt栈空直接入栈,非空若当前运算符大于s_opt栈顶的优先级才可入栈)
     * 3.'('(直接入栈s_opt)
     * 4.')'(一直弹出栈顶元素,直到遇到'(',将其弹出后,继续遍历字符串)
     * 5.遍历结束,依次弹出栈内元素
     * 从s_opt中每弹出一个运算符(除左括号外),就要从s_num中弹出两个数字参与运算,并将结果放回s_num中
     */
    while(opt[i]!='\0'||s_opt.isEmpty()!=true){
        if(opt[i]>='0'&&opt[i]<='9'){//数字
            tmp=tmp*10+opt[i]-'0';
            i++;
            if(opt[i]<'0'||opt[i]>'9'){
                s_num.push(tmp);
                tmp=0;
            }
        }
        else{//运算符
            if(s_opt.isEmpty()==true||Priority(opt[i])>Priority(s_opt.top())||
                    (s_opt.top()=='(' && opt[i]!=')')){
                s_opt.push(opt[i]);
                i++;
                continue;
            }//将运算符入栈
            if(s_opt.top()=='('&&opt[i]==')'){
                s_opt.pop();
                i++;
                continue;
            }//将运算符'('出栈
            if(Priority(opt[i])<=Priority(s_opt.top())||(opt[i]==')'&&s_opt.top()!='(')
                    ||(opt[i]=='\0'&&s_opt.isEmpty()!=true)){
                num2=s_num.pop();
                num1=s_num.pop();
                switch (s_opt.pop()) {
                    case '+':
                        s_num.push(num1+num2);
                        break;
                    case '-':
                        s_num.push(num1-num2);
                        break;
                    case '*':
                        s_num.push(num1*num2);
                        break;
                    case '/':
                        s_num.push(num1/num2);
                        break;
                    default:
                        break;
                }
            }//将其他运算符出栈,并弹出两个元素进行计算
        }
    }
    ui->showLineEdit->setText(QString::number(s_num.top()));
    expression.clear();
}

int Widget:: Priority(char ch){//优先级函数
    switch (ch) {
        case '(': return 3;
        case '*':
        case '/': return 2;
        case '+':
        case '-': return 1;
        default:
            return 0;
    }
}

10QObject定时器 startTimer killTimer 事件函数QTimerEvent

1)在label标签上放图片方法一

QPixmap pix("E:\\22cqqCode\\QtCode\\objectTimer\\1.jpeg");
ui->label->setPixmap(pix);

2)用QObject定时器实现图片1秒钟切换一次
在这里插入图片描述
总结widget.cpp文件:

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
	//放图片
    pixId=2;
    QPixmap pix("E:\\22cqqCode\\QtCode\\objectTimer\\1.jpeg");
    ui->label->setPixmap(pix);
}

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

void Widget::on_startButton_clicked()
{
    //开启定时器,返回定时器编号
    myTimerId = this->startTimer(TIMEOUT);
}
void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId()!=myTimerId)
        return ;

    //更新图片
    QString path("E:\\22cqqCode\\QtCode\\objectTimer\\");
    path+=QString::number(pixId);
    path+=".jpeg";
    QPixmap pix(path);
    ui->label->setPixmap(pix);
    pixId++;
    if(6==pixId) pixId=1;
}
void Widget::on_stopButton_clicked()
{
    this->killTimer(myTimerId);
}

QObject定时器主要是三个函数,开始startTimer,触发事件,结束killTimer

11QTimer定时器

1)在label标签上放图片方法二

QImage img;
img.load("E:\\22cqqCode\\QtCode\\objectTimer\\1.jpeg");
ui->label->setPixmap(QPixmap::fromImage(img));

2)用QTimer定时器实现图片1秒钟切换一次;
用QTimer定时器实现图片1秒钟切换,只切换一次
widget.h文件中的槽函数和成员变量
在这里插入图片描述
总结widget.cpp文件:

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer=new QTimer;//指针初始化
    //放图片
    QImage img;
    img.load("E:\\22cqqCode\\QtCode\\objectTimer\\1.jpeg");
    ui->label->setPixmap(QPixmap::fromImage(img));
    pixId=2;
    //定时器时间到,发出timeout信号
    connect(timer,&QTimer::timeout,this,&Widget::timeoutSlot);
}

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

void Widget::on_startButton_clicked()
{
    timer->start(TIMEOUT);//开始定时器,时间为TIMEOUT=1000ms
}
void Widget::timeoutSlot()
{
    QString path;
    path="E:\\22cqqCode\\QtCode\\objectTimer\\";
    path+=QString::number(pixId);
    path+=".jpeg";
    QImage img;
    img.load(path);
    ui->label->setPixmap(QPixmap::fromImage(img));
    pixId++;
    if(pixId==6) pixId=1;
}
void Widget::on_endButton_clicked()
{
    timer->stop();//结束
}
void Widget::on_singleButton_clicked()
{
    QTimer::singleShot(1000,this,SLOT(timeoutSlot()));//单次执行超时触发函数
}

12文件操作(QMainWindow),简易记事本(新建,打开,另存为,ctrl+s键盘事件)

1)QMainWindow菜单栏
在这里插入图片描述

2)通过connect连接信号和槽

connect(ui->newAction,&QAction::triggered,this,&MainWindow::newActionSlot);
connect(ui->openAction,&QAction::triggered,this,&MainWindow::openActionSlot);
connect(ui->saveAction,&QAction::triggered,this,&MainWindow::saveActionSlot);

3)读文件和写文件

//读文件
QString fileName=QFileDialog::getOpenFileName(this,"选择一个文件",
                                 QCoreApplication::applicationFilePath(),"*.cpp");
//写文件                                
QString fileName=QFileDialog::getSaveFileName(this,"选择一个文件",
                                QCoreApplication::applicationFilePath());                                 

4)鼠标事件QMouseEvent,键盘事件QKeyEvent,ctrl+S实现保存
在这里插入图片描述

总结widget.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //被单击的时候触发事件
    connect(ui->newAction,&QAction::triggered,this,&MainWindow::newActionSlot);
    connect(ui->openAction,&QAction::triggered,this,&MainWindow::openActionSlot);
    connect(ui->saveAction,&QAction::triggered,this,&MainWindow::saveActionSlot);
}

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

void MainWindow::newActionSlot()
{
    ui->textEdit->clear();
    this->setWindowTitle("新建文本文档.txt");
}
void MainWindow::openActionSlot()
{
    QString fileName=QFileDialog::getOpenFileName(this,"选择一个文件",
                                 QCoreApplication::applicationFilePath());
    if(fileName.isEmpty()){
        QMessageBox::warning(this,"警告","请选择一个文件");
    }
    else{
        //打印
        qDebug()<<fileName;
        QFile file(fileName);
        file.open(QIODevice::ReadOnly);
        QByteArray ba=file.readAll();
        ui->textEdit->setText(QString(ba));
        file.close();
    }
}
void MainWindow::saveActionSlot()
{
    QString fileName=QFileDialog::getSaveFileName(this,"选择一个文件",
                                QCoreApplication::applicationFilePath());
    if(fileName.isEmpty()){
        QMessageBox::warning(this,"警告","请选择一个文件");
    }
    else{
        QFile file(fileName);
        file.open(QIODevice::WriteOnly);
        QByteArray ba;
        ba.append(ui->textEdit->toPlainText());
        file.write(ba);
        file.close();
    }
}
void MainWindow::keyPressEvent(QKeyEvent *k)
{
    if(k->modifiers()==Qt::ControlModifier&&k->key()==Qt::Key_S){
        saveActionSlot();
    }
}
void MainWindow::mousePressEvent(QMouseEvent *m)
{
    QPoint pt=m->pos();
    qDebug()<<pt;
    if(m->button()==Qt::LeftButton){
        qDebug()<<"左键被按下";
    }
    if(m->button()==Qt::RightButton){
        qDebug()<<"右键被按下";
    }
}


13TCP客户端和TCP服务器,Qt启动新窗口

1)TCP服务器 socket bind listen accept send/recv
TCP客户端 socket connect send/recv

服务器和客户端的ui界面
在这里插入图片描述

涉及到网络操作需要在工程文件中添加network
在这里插入图片描述
2)客户端发出连接, 连接成功发出connected,连接断开发出disconnected信号
在这里插入图片描述
3)服务器监听ip地址和端口号
在这里插入图片描述
4)客户端向服务器发送信息,创建新的窗口
在这里插入图片描述在这里插入图片描述
修改槽函数,连接成功的时候出现聊天界面
在这里插入图片描述
chat.cpp文件中的发送按钮触发的槽函数
在这里插入图片描述

总结,

  1. 客户端需要有聊天窗口,当连接成功时,创建新的窗口,也要将socket对象传过去
  2. 聊天窗口的信号与槽操作,将聊天内容通过socket->write写入
  3. 服务器端通过sender()函数获取信号的发出者socket,然后通过socket->readAll读出发送的信息
//服务器收到客户端发送的信息,socket发出readyread信号
connect(socket,&QTcpSocket::readyRead,this,&Widget::clientInfoSlot);

void Widget::clientInfoSlot()
{
    //获取信号的发出者
    QTcpSocket *s=qobject_cast<QTcpSocket *>(sender());//强制类型转换
    ui->mainLineEdit->setText(QString( s->readAll()));
}

14多线程 QThread

服务器端使用多线程
mythread.h文件

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QTcpSocket>
#include <QDebug>

class myThread : public QThread
{
    Q_OBJECT
public:
    explicit myThread(QTcpSocket *s);
    void run();//线程处理函数
signals:

public slots:
    void clientInfoSlot();

private:
    QTcpSocket *socket;
};


#endif // MYTHREAD_H

mythread.cpp文件

#include "mythread.h"

myThread::myThread(QTcpSocket *s)
{
    socket=s;
}
void myThread::run()
{
    //处理客户端
    connect(socket,&QTcpSocket::readyRead,this,&myThread::clientInfoSlot);
}
//无法通过ui打印在界面上 ,不能在其他类里面操作界面
void myThread::clientInfoSlot()
{
    QByteArray ba=socket->readAll();
    qDebug()<<QString(ba);//信息显示在服务器的输出端
}

在widget.cpp文件中连接成功的槽函数中启动线程
在这里插入图片描述

缺陷是:不能在其他类里面操作界面,也就是无法在mythread中操作ui界面,使得客户端发送的信息能够显示在服务器界面上
解决:下面的自定义信号,然后通过emit关键字发送信号

15自定义信号Signals

实现将对象t中的内容发送到对象w中显示出来
mythread.h文件中添加自定义信号
在这里插入图片描述
mythread.cpp文件中需要修改部分
在这里插入图片描述
widget.cpp构造函数中修改部分以及threadSlot(QByteArray b)函数
在这里插入图片描述

数据的显示是服务器后台的线程收到信息,线程通过信号把数据发送到窗口,窗口通过控件显示数据

16MySQL数据库

1)涉及到数据库操作需要在工程文件中添加sql
在这里插入图片描述
2)widget.cpp文件中数据库连接的操作

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

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

    //连接数据库
    db=QSqlDatabase::addDatabase("QMYSQL");//加载MySQL数据库驱动
    db.setDatabaseName("mydatabase");//数据库名
    db.setPort(3306);//端口号
    db.setHostName("localhost");//主机名
    db.setUserName("root");//用户名
    db.setPassword("root");//用户密码
    if(db.open())
    {
        QMessageBox::information(this,"连接提示","连接成功");
    }
    else
    {
        QMessageBox::warning(this,"连接提示","连接失败");
    }

}

Widget::~Widget()
{
    delete ui;
}
//查询
void Widget::on_selectButton_clicked()
{
    QSqlQuery query;
    query.exec("select * from student;");//query.exec执行
    while (query.next()) {//query.next指向结果集的下一条记录
        qDebug()<<query.value(0)<<query.value(1)<<query.value(2);//query.value
    }
}
//插入
void Widget::on_insertButton_clicked()
{
    QString id=ui->idLineEdit->text();
    QString name=ui->nameLineEdit->text();
    QString birth=ui->birthLineEdit->text();
    QString sql=QString("insert into student values(%1,'%2','%3');").arg(id).arg(name).arg(birth);
    QSqlQuery query;
    if(query.exec(sql))
    {
        QMessageBox::information(this,"插入提示","插入成功");
    }
    else {
        QMessageBox::warning(this,"插入提示","插入失败");
    }
}

3)在这里插入图片描述

17 QTableView控件

1)QTableView
在这里插入图片描述

2)widget.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlTableModel>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    QSqlTableModel *m;
};

#endif // WIDGET_H

3)widget.cpp文件

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");//加载MySQL数据库驱动
    db.setDatabaseName("mydatabase");
    db.setPort(3306);
    db.setHostName("localhost");
    db.setUserName("root");
    db.setPassword("root");
    if(db.open())
    {
        QMessageBox::information(this,"连接提示","连接成功");

        m=new QSqlTableModel(this);
        m->setTable("student");//与表连接
        ui->tableView->setModel(m);
    }
    else
    {
        QMessageBox::warning(this,"连接提示","连接失败");
    }
}

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

void Widget::on_pushButton_clicked()
{
    m->select();
}

4)关键
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt学习笔记 的相关文章

  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 获取 QPushButton 在 2D 数组 QPushButton 上的索引

    我有一个二维数组QPushButton 当用户单击按钮时如何获取按钮的索引 例如当用户单击按钮时a 2 3 它会显示 2 3 该示例如下所示 Qt 4 5 使用对象名称 您可以为按钮指定唯一的对象名称 理想情况下 名称应该是有效的 C 标识
  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • Qt 人工鼠标点击无法正常工作

    小玩具应用程序可以在这里找到 http gist github com 517445 http gist github com 517445 我正在尝试将人工鼠标事件发送到小部件 我使用QApplication sendEvent为此 接下
  • 在 Qt 服务器上验证用户身份

    我正在尝试使用 C QtTcpSocket 为个人项目 多人国际象棋游戏 实现身份验证系统 我的朋友建议了一种验证用户的方法 但我想问是否有更简单或更好的方法 来自 Python 背景 做这个项目主要是为了加深对 C 的理解 我将发布我朋友
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • 如何在针对 Windows XP 的情况下使用 VS2012 构建 Qt 4/5?

    我正在尝试使用 Visual Studio 2012 构建 Qt 4 8 5 Qt 5 2 1 针对 Windows XP SDK v7 1a 使用 VS2102 编译时 源代码与 SDK v7 1a 存在各种不兼容性 因此无法开箱即用 这
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • PyQt4 QPalette 不工作

    btn QtGui QPushButton Button self palettes btn palette palettes setColor btn backgroundRole QtCore Qt green btn setPalet
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方

随机推荐

  • 基于OpenCV的两种圆弧长度测量方法

    基于OpenCV的两种圆弧长度测量方法 OpenCV是广泛使用的计算机视觉库 在图像处理中 圆弧的长度是一个非常重要的参数 本文将会介绍两种基于OpenCV的圆弧长度测量方法 一种是通过弧度法测量圆弧长度 另一种则是通过插值法测量圆弧长度
  • jar包打不开怎么处理?

    第一种情况 首先win R 输入cmd打开命令行窗口 输入javac 检查一下是否有问题 正常的情况应该是下图这种 如果不是这种的 重新弄配置下你的环境变量 第二种情况 找到jdk目录下的bin文件夹 用里面的javaw打开 可以设置为默认
  • 约瑟夫问题

    约瑟夫问题 约瑟夫问题一般有两种解决方法 一种数组 一种链表 本次采用数组方式说明解决 规则 n个人围成一个圈 每个人分别标注为1 2 n 要求从1号从1开始报数 报到k的人出圈 接着下一个人又从1开始报数 如此循环 直到只剩最后一个人时
  • eclipse web项目目录结构

    按照 Java EE 规范的规定 一个典型的 Web 应用程序有四个部分 1 公开目录 2 WEB INF web xml 文件 发布描述符 必选 3 WEB INF classes 目录 编译后的 Java类文件 可选 4 WEB INF
  • Vue实现动态锚点

    前几天做项目的时候 需要实现一个动态锚点的效果 如果是传统项目 这个效果就非常简单 但是放到 Vue 中 就有两大难题 1 在没有 jQuery 的 animate 方法的情况下 如何实现平滑滚动 2 如何监听页面滚动事件 在浏览了大量文章
  • STM32串口中断卡死主循环一直进中断问题分析-2021-10-05

    在一项目中 使用STM32作为主控 程序运行一段时间后概率出现主循环卡死现象 问题分析如下 1 程序USART2不停接收并处理串口数据 波特率115200 2 主循环卡死 3 USART1中断及TIM2中断响应函数运行正常 USART1及T
  • Html中截取url参数 实现HTML间的url传值

    大家好 今天遇到一个问题 页面全是html url传值 竟然获取不到参数值 A html 登录按钮 jQuery function login click function ajax url http 10 9 80 211 8090 ia
  • vue的多层主键的通信

    div div
  • 标准化与标准计分

    其实就是衡量 含金量 的一种方法 标准计分其实就是 距离 标准差 貌似和离差很像 离差就是 距离 标准差 10 50 对于分数来说 如果与平均分的距离越大 含金量就越高呢 在组数据中 可以求分均值 中位数以及标准差了 以考试成绩为例 现在
  • 模糊算法51单片机学习应用(一)模糊化

    模糊算法51单片机学习应用 一 模糊化 最近在尝试学习模糊算法 网上查了很多材料 大多都是写原理 粗略一看好像感觉我懂了 但是真的要做的话 却完全不知道从哪里开始入手 其实 对我们首次学习使用的人来说 我们不要那些高大上的原理 我们先理解他
  • react中样式的使用(内联和外部样式表)

    1 在src中新建三个子组件分别为 Header Footer Content 2 在里面分别写入代码 建议用rcc快捷方式 Header js中代码如下 import React Component from react var Head
  • Java中哈希集(HashSet)概念,实现以及操作

    Java中HashSet的用法 1 HashSet概念 2 Java文档中HashSet的实现 3 HashSet的构造函数 3 1 HashSet 3 2 HashSet int initialCapacity 3 3 HashSet i
  • Ubuntu 安装 pytorch

    使用 pytorch 进行深度学习训练 这也是我不得不选择 linux 的原因 系统 ubuntu 22 04 型号 Lenovo Yoga 14sIHU 2021 集显 Irix Xe lspci grep i vga 独显 GeForc
  • diff linux文件夹patch,Linux中的版本控制---diff和patch命令

    一 构造两个用于测试的文件 hello txt world txt 二 用diff命令比较两个文本文件的差异 对这个两个文本文件执行diff 命令 并通过输出重定向 将差异保存在diff txt文件中 diff u hello txt wo
  • 使用 Docker Compose 部署 Elasticsearch + Kibana

    本篇文章主要介绍了使用 Docker Compse 部署 Elasticsearch Kibana 并整合到 Spring Boot 项目中的详细步骤 Elasticsearch Kibana 版本 7 17 0 7 的最新版本 Sprin
  • Android 语音播放Media Player

    原文地址 https developer android com guide topics media mediaplayer html viacontentresolver 语音播放 因为实习工作相关的缘故 最近在学习android语音播
  • 多个RecycleView 嵌套显示不全的情况

    场景 项目中最外层使用ScrollView 里面嵌套了recycleview recycleview中又嵌套了多个recycleview 导致部分recycleview显示不出来 app界面的结构图
  • 空间域图像增强:图像锐化/增强

    空间域图像增强 OpenCV图像锐化 增强 0 综述 1 Laplacian高通滤波算子 2 Laplacian锐化代码实践 3 USM锐化增强算法 4 USM代码实践 0 综述 图像的卷积计算除了可以完成我们前面介绍的模糊去噪 边缘检测等
  • anaconda3.6.5安装pyhive

    1 首先安装anaconda3 6 5 略 2 配置好bin下环境变量 3 来到anaconda官网 搜索需要的包 pyhive 不是anaconda前缀的也行 例如biaze pyhive https anaconda org anaco
  • Qt学习笔记

    1 Qt 音同 cute 是一个跨平台的 C 开发库 主要用来开发图形用户界面 Graphical User Interface GUI 程序 当然也可以开发不带界面的命令行 Command User Interface CUI 程序 2