用QT实现一个多页面系统参数管理窗口

有时候系统参数需要分类:比如一般参数,网络配置,高级配置,

这时需要分页进行配置与显示,用TabWidget可以解决这个问题。

源码类:

1)头文件

#ifndef CONFIGWIDGET_H
#define CONFIGWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QMessageBox>
#include <QTabWidget>

#include "ConfigManager.h"

class ConfigWidget : public QWidget {
    Q_OBJECT

public:
    ConfigWidget(ConfigManager *configManager, QWidget *parent = nullptr);
    ConfigWidget(QWidget *parent = nullptr);

private:
    void setupTabs();
    void loadSettings();
    void saveSettings();

    QTabWidget *tabWidget;
    //general Page
    QLineEdit *generalSetting1;
    QLineEdit *generalSetting2;

    //network page
    QLineEdit *networkIP;
    QLineEdit *networkPort;

    //advance page
    QLineEdit *advancedOption1;
    QLineEdit *advancedOption2;

    QSettings settings;
};


#endif // CONFIGWIDGET_H

2)实现文件

#include "configwidget.h"

ConfigWidget::ConfigWidget(ConfigManager *configManager, QWidget *parent)
    : QWidget(parent)
    ,tabWidget(new QTabWidget(this))
{
    QVBoxLayout *vboxLayout = new QVBoxLayout(this);
    vboxLayout->addWidget(tabWidget);

    setupTabs();
    loadSettings();
}

ConfigWidget::ConfigWidget(QWidget *parent)
    : QWidget(parent)
    ,tabWidget(new QTabWidget(this))
{
    QVBoxLayout *vboxLayout = new QVBoxLayout(this);
    vboxLayout->addWidget(tabWidget);

    setupTabs();
    loadSettings();
}

void ConfigWidget::setupTabs()
{
    // General Configuration Page
    QWidget *generalPage = new QWidget(this);
    QFormLayout *generalLayout = new QFormLayout(generalPage);
    generalLayout->addRow(new QLabel("Setting 1:"), generalSetting1 = new QLineEdit(generalPage));
    generalLayout->addRow(new QLabel("Setting 2:"), generalSetting2 = new QLineEdit(generalPage));
    generalPage->setLayout(generalLayout);

    // Network Configuration Page
    QWidget *networkPage = new QWidget(this);
    QFormLayout *networkLayout = new QFormLayout(networkPage);
    networkLayout->addRow(new QLabel("IP Address:"), networkIP = new QLineEdit(networkPage));
    networkLayout->addRow(new QLabel("Port:"), networkPort = new QLineEdit(networkPage));
    networkPage->setLayout(networkLayout);

    // Advanced Configuration Page
    QWidget *advancedPage = new QWidget(this);
    QFormLayout *advancedLayout = new QFormLayout(advancedPage);
    advancedLayout->addRow(new QLabel("Option 1:"), advancedOption1 = new QLineEdit(advancedPage));
    advancedLayout->addRow(new QLabel("Option 2:"), advancedOption2 = new QLineEdit(advancedPage));
    advancedPage->setLayout(advancedLayout);

    // Adding pages to the QTabWidget
    tabWidget->addTab(generalPage, "General");
    tabWidget->addTab(networkPage, "Network");
    tabWidget->addTab(advancedPage, "Advanced");

    // Save Button
    QPushButton *saveButton = new QPushButton("Save", this);
    connect(saveButton, &QPushButton::clicked, this, &ConfigWidget::saveSettings);
    generalLayout->addWidget(saveButton);
}

void ConfigWidget::loadSettings()
{
    generalSetting1->setText(settings.value("general/setting1", "").toString());
    generalSetting2->setText(settings.value("general/setting2", "").toString());
    networkIP->setText(settings.value("network/ip", "").toString());
    networkPort->setText(settings.value("network/port", "").toString());
    advancedOption1->setText(settings.value("advanced/option1", "").toString());
    advancedOption2->setText(settings.value("advanced/option2", "").toString());
}

void ConfigWidget::saveSettings()
{
    settings.setValue("general/setting1", generalSetting1->text());
    settings.setValue("general/setting2", generalSetting2->text());
    settings.setValue("network/ip", networkIP->text());
    settings.setValue("network/port", networkPort->text());
    settings.setValue("advanced/option1", advancedOption1->text());
    settings.setValue("advanced/option2", advancedOption2->text());
}

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要准备好QT Creator开发环境和微信开放平台的注册信息。 下面是一个简单的实现微信登录页面的示例代码: ``` #include "mainwindow.h" #include "ui_mainwindow.h" #include <QNetworkRequest> #include <QNetworkReply> #include <QUrlQuery> #include <QJsonDocument> #include <QJsonObject> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 设置登录页面的背景图片 QPixmap pixmap(":/images/background.jpg"); ui->backgroundLabel->setPixmap(pixmap); // 点击登录按钮后触发的事件 connect(ui->loginButton, &QPushButton::clicked, this, &MainWindow::onLoginButtonClicked); } MainWindow::~MainWindow() { delete ui; } void MainWindow::onLoginButtonClicked() { // 构造请求URL QString appId = "你的AppID"; QString redirectUri = "http://www.example.com/"; QString scope = "snsapi_login"; QString state = "wechat_login"; QString url = QString("https://open.weixin.qq.com/connect/qrconnect?" "appid=%1&" "redirect_uri=%2&" "response_type=code&" "scope=%3&" "state=%4#wechat_redirect") .arg(appId) .arg(redirectUri) .arg(scope) .arg(state); // 打开浏览器窗口,让用户扫描二维码登录 QDesktopServices::openUrl(QUrl(url)); } void MainWindow::onUrlChanged(const QUrl &url) { // 提取URL中的code参数 QString code; if (url.toString().contains("code=")) { code = QUrlQuery(url).queryItemValue("code"); } if (!code.isEmpty()) { // 构造获取access_token的请求 QString appId = "你的AppID"; QString appSecret = "你的AppSecret"; QString url = QString("https://api.weixin.qq.com/sns/oauth2/access_token?" "appid=%1&" "secret=%2&" "code=%3&" "grant_type=authorization_code") .arg(appId) .arg(appSecret) .arg(code); // 发送获取access_token的请求 QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, &QNetworkAccessManager::finished, this, &MainWindow::onAccessTokenReplyFinished); QNetworkRequest request(QUrl(url)); manager->get(request); } } void MainWindow::onAccessTokenReplyFinished(QNetworkReply *reply) { // 解析获取access_token的响应 QByteArray data = reply->readAll(); QJsonDocument doc = QJsonDocument::fromJson(data); QJsonObject obj = doc.object(); if (obj.contains("errcode")) { // 获取access_token失败 int errcode = obj.value("errcode").toInt(); QString errmsg = obj.value("errmsg").toString(); QMessageBox::critical(this, "Error", QString("获取access_token失败: %1(%2)").arg(errmsg).arg(errcode)); } else { // 获取access_token成功 QString accessToken = obj.value("access_token").toString(); QString openId = obj.value("openid").toString(); // TODO: 进行下一步操作,例如获取用户信息并登录 } } ``` 在MainWindow类的构造函数中,我们设置了登录页面的背景图片,并连接了登录按钮的clicked信号到onLoginButtonClicked槽函数上。 在onLoginButtonClicked槽函数中,我们构造了获取二维码URL,并打开了浏览器窗口,让用户扫描二维码登录。 在MainWindow类中,我们还定义了onUrlChanged和onAccessTokenReplyFinished两个槽函数。onUrlChanged槽函数会在浏览器窗口的URL发生变化时被调用,我们可以在这里提取出URL中的code参数。onAccessTokenReplyFinished槽函数会在获取access_token的请求完成后被调用,我们可以在这里解析获取access_token的响应,并进行下一步操作,例如获取用户信息并登录。 当用户在浏览器窗口中扫描完二维码后,会被重定向到我们在微信开放平台上注册的回调URL(即上面代码中的redirectUri参数)。在这里,我们可以通过QDesktopServices::openUrl打开一个隐藏的浏览器窗口,以便获取URL的变化。当浏览器窗口的URL发生变化时,会触发onUrlChanged槽函数。在这里,我们可以提取URL中的code参数,并发送获取access_token的请求。获取access_token的请求完成后,会触发onAccessTokenReplyFinished槽函数。在这里,我们可以解析获取access_token的响应,并进行下一步操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值