UI+代码混合开发

UI控件

imageimageimage

代码

image
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProgressBar>
#include <QLabel>
#include <QSpinBox>
#include <QFontComboBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QLabel *fLabCurFile;
    QProgressBar *progressBar;
    QSpinBox *spinFontSize;
    QFontComboBox *comboFont;

    void initUI();
    void initSingalSlots(); //需要将自定义的槽和信号绑定在一起

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actFontBold_triggered(bool checked);

    void on_actFontItalic_triggered(bool checked);

    void on_actFontUnder_triggered(bool checked);

    void on_textEdit_copyAvailable(bool b);

    void on_textEdit_selectionChanged();

    /* 如果是自己写的控件,就要自己命名槽函数 */
    void on_spinBoxFontSize_valueChanged(int aFontSize); //改变字体大小
    void on_comboFont_currentIndexChanged(const QString &arg1); //改变字体,const 表示改变不了原有库的数据

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

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

void MainWindow::initUI()
{
    /* 设置QLabel */
    fLabCurFile = new QLabel();
    fLabCurFile->setMinimumWidth(150); //设置最小宽度
    fLabCurFile->setText("当前文件:");
    ui->statusbar->addWidget(fLabCurFile);

    /* 设置QProgressBar */
    progressBar = new QProgressBar;
    progressBar->setMinimum(5);
    progressBar->setMaximum(50);
    progressBar->setValue(ui->textEdit->font().pointSize());
    ui->statusbar->addWidget(progressBar);

    /* 设置QSpinBox */
    spinFontSize = new QSpinBox;
    spinFontSize->setMinimum(5);
    spinFontSize->setMaximum(50);
    ui->mainToolBar->addWidget(new QLabel("字体大小"));
    ui->mainToolBar->addWidget(spinFontSize);

    /* 设置QComboBox */
    comboFont = new QFontComboBox;
    ui->mainToolBar->addWidget(new QLabel("字体"));
    ui->mainToolBar->addWidget(comboFont);

    setCentralWidget(ui->textEdit); //将中间的文本框中心布局
}

void MainWindow::initSingalSlots()
{
    //检测到值发生变化的时候
    connect(spinFontSize, SIGNAL(valueChanged(int)),
            this, SLOT(on_spinBoxFontSize_valueChanged(int)));
    connect(comboFont, SIGNAL(currentIndexChanged(const QString&)),
            this, SLOT(on_comboFont_currentIndexChanged(const QString&)));
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //写好了调用
    initUI();
    initSingalSlots();
}

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


void MainWindow::on_actFontBold_triggered(bool checked)
{
    QTextCharFormat fmt;
    if(checked)
        fmt.setFontWeight(QFont::Bold);
    else
        fmt.setFontWeight(QFont::Normal);
    ui->textEdit->mergeCurrentCharFormat(fmt);
}

void MainWindow::on_actFontItalic_triggered(bool checked)
{
    QTextCharFormat fmt;
    fmt.setFontItalic(checked);
    ui->textEdit->mergeCurrentCharFormat(fmt);
}

void MainWindow::on_actFontUnder_triggered(bool checked)
{
    QTextCharFormat fmt;
    fmt.setFontUnderline(checked);
    ui->textEdit->mergeCurrentCharFormat(fmt);
}

void MainWindow::on_textEdit_copyAvailable(bool b)
{
    ui->actCut->setEnabled(b); //允许拷贝
    ui->actCopy->setEnabled(b);
    ui->actPaste->setEnabled(ui->textEdit->canPaste());
}

void MainWindow::on_textEdit_selectionChanged()
{
    /* 选中了一段文件,可以看到按钮是不是被选中 */
    QTextCharFormat fmt;
    fmt = ui->textEdit->currentCharFormat(); //获取当前状态
    ui->actFontItalic->setChecked(fmt.fontItalic());
    ui->actFontUnder->setChecked(fmt.fontUnderline());
    ui->actFontBold->setChecked(fmt.font().bold());
}

void MainWindow::on_spinBoxFontSize_valueChanged(int aFontSize)
{
    QTextCharFormat fmt;
    fmt.setFontPointSize(aFontSize);
    ui->textEdit->mergeCurrentCharFormat(fmt);
    progressBar->setValue(aFontSize); //下面的百分比会跟着改变
}

void MainWindow::on_comboFont_currentIndexChanged(const QString &arg1)
{
    QTextCharFormat fmt;
    fmt.setFontFamily(arg1);
    ui->textEdit->mergeCurrentCharFormat(fmt);

}

效果

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt和CEF可以实现混合开发,即将两种技术和优点结合起来,开发出高效、高可靠性的应用程序。下面我们来看一个Qt CEF混合开发应用实例。 以开发一个简单的浏览器为例,首先使用QtQtWebEngine模块创建浏览器框架,然后使用CEF库来加载HTML页面。具体步骤如下: 1.创建Qt浏览器框架:使用QtWebEngine模块创建一个基本的浏览器窗口,该窗口可以包含地址栏、前进/后退、刷新等基本浏览器功能。 2.集成CEF:将CEF库与Qt框架集成。CEF库是一个基于Chromium开发的框架,可以用于加载HTML、JavaScript、CSS等Web技术。CEF库提供了强大的JavaScript和UI交互能力,可以通过CEF实现更多更复杂的功能。 3.在Qt中使用CEF:通过Qt的QWindow类和CEF的CefWindowHandle类实现QWindow和CEF窗口之间的交互。可以使用Qt的信号/槽机制来处理CEF窗口的事件。 4.加载HTML页面:通过CEF加载HTML页面,通过Qt的WebView控件在浏览器框架中显示页面内容。 通过以上步骤,我们可以创建一个基于Qt和CEF混合开发的浏览器应用程序。这种混合开发方式可以充分利用Qt和CEF提供的各自的优势,开发出高效、高可靠性的应用程序。同时也可以在UI和交互方面更加灵活地实现各种功能。 ### 回答2: Qt和CEF(Chromium Embedded Framework)混合开发应用可以使你开发跨平台的、具有Web前端组件的应用,为用户提供更好的用户体验和更丰富的交互特性,下面是一个实例。 我们可以使用Qt作为应用程序框架,同时使用CEF作为嵌入的Web浏览器来呈现Web内容。这个应用程序使用了Qt的GUI组件、CEF的Web组件和C++的普通类和函数来实现。 具体实现过程如下: 1. 下载和安装CEF。CEF是一个本地Web浏览器框架,支持Windows、macOS和Linux系统。它允许你使用Chromium浏览器内核来呈现Web内容。CEF提供了一系列的API和工具来支持应用与Web内容直接的交互。 2. 使用Qt Creator创建一个新的Qt Widgets应用程序。在项目设置中配置如下: a. 加入CEF运行时库文件和头文件。 b. 对于Windows平台,在项目属性中配置Qt和CEF的链接库。 c. 添加一个Qt Form作为主界面。 3. 在Qt代码中使用CEF组件,在主界面中添加一个QVBoxLayout。将CEF Widget直接放在这个Layout中,从而实现与其他Qt Widgets的混合。 4. 在C++代码中创建一个CEF浏览器对象。这个对象负责加载和解析Web页面,和处理浏览器事件。在开始时CEF浏览器会调用on_loading_state_change()回调函数,它表示CEF正在加载Web页面。 5. 当CEF浏览器加载Web页面时,处理web页面中的事件,例如提交表单、点击按钮等。CEF JavaScript Binding桥接机制可以让你在C++代码中注册JavaScript回调,让Web侧能够调用本地功能。CEF也允许你从Web页面中注入JavaScript脚本,以实现与本地代码的通信。 总结:使用Qt和CEF混合开发应用,可以开发出具有极佳用户体验的跨平台应用程序,一方面,可以充分利用CEF提供的强大的Web交互能力,另一方面,可以使用Qt的GUI组件来构建应用程序框架,并使其与Web组件混合。对于开发者而言,这意味着更轻松的应用程序开发和更高效的应用程序交互方式。 ### 回答3: qt和cef的混合开发应用是通过将QT的界面与CEF的web浏览器引擎相结合,实现了一种可支持Web技术的应用程序的开发方式。 比如在一个桌面应用程序中,用户可以在QT界面中使用CEF作为内置浏览器来浏览Web页面或连接Web服务。 一种实例是使用QT中的QWebEngineView来加载CEF中的Web页面,可以通过QWebChannel来实现QT和CEF两者之间的通信,例如把QT中的JavaScript对象传递到CEF中,或者把CEF中的事件传递到QT中进行处理。这样可以实现在QT应用程序中嵌入Web浏览器,同时利用QT的强大框架和CEF的强大Web渲染技术为应用程序添加更多的功能。 另外,QT中还提供了QtWebEngineWidgets来支持类似于CEF的Web浏览器功能,同时可以与QT的界面框架无缝整合,用于创建具有丰富Web功能的桌面应用程序。 总之,QT和CEF的混合开发应用可以扩展应用程序的Web功能,从而提供更加丰富、更加强大的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值