iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++ QT实现自定义对话框的方法是什么
  • 299
分享到

C/C++ QT实现自定义对话框的方法是什么

2023-06-21 20:06:36 299人浏览 泡泡鱼
摘要

这篇文章主要讲解了“C/C++ Qt实现自定义对话框的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C/c++ QT实现自定义对话框的方法是什么”吧!对话框分为

这篇文章主要讲解了“C/C++ Qt实现自定义对话框的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C/c++ QT实现自定义对话框的方法是什么”吧!

对话框分为多种,常见的有通用对话框,自定义对话框,模态对话框,非模态对话框等,其中通用对话框包括了,QFileDialog文件对话框,QColorDialog颜色对话框,QFontDialog字体对话框,QInputDialog输入对话框等,自定义对话框则主要是实现自己布局的简单页面,区别于窗体对话框则显得更加简单一些,除对话框外,多窗体设计也是最常用的,例如多窗体嵌入,MID窗体等,下面则是每种窗体的代码总结

创建自定义窗体

首先使用两个控件,TableView主要是表格处理,TreeView主要是树形框,这两者可以通过 QItemSelectionModel 模型绑定起来从而可实现菜单联动。

# mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <iOStream>#include <QStandardItem>#include <QItemSelectionModel>QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = nullptr);    ~MainWindow();private:    Ui::MainWindow *ui;    QStandardItemModel *model;       // 定义数据模型    QItemSelectionModel *selection;  // 定义Item选择模型};#endif // MAINWINDOW_H
# mainwindow.cpp#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){    ui->setupUi(this);    model = new QStandardItemModel(4,5,this);    selection = new QItemSelectionModel(model);    // 关联到tableView    ui->tableView->setModel(model);    ui->tableView->setSelectionModel(selection);    // 关联到treeView    ui->treeView->setModel(model);    ui->treeView->setSelectionModel(selection);    // 添加表头    QStringList HeaderList;    HeaderList << "序号" << "姓名" << "年龄" << "性别" << "婚否";    model->setHorizontalHeaderLabels(HeaderList);    // 批量添加数据    QStringList DataList[3];    QStandardItem *Item;    DataList[0] << "1001" << "admin" << "24" << "男" << "是";    DataList[1] << "1002" << "lyshark" << "23" << "男" << "否";    DataList[2] << "1003" << "lucy" << "37" << "女" << "是";    int Array_Length = DataList->length();                          // 获取每个数组中元素数    int Array_Count = sizeof(DataList) / sizeof(DataList[0]);       // 获取数组个数    for(int x=0; x<Array_Count; x++)    {        for(int y=0; y<Array_Length; y++)        {            Item = new QStandardItem(DataList[x][y]);            model->setItem(x,y,Item);        }    }}MainWindow::~MainWindow(){    delete ui;}

C/C++ QT实现自定义对话框的方法是什么

首先来创建一个自定义对话框,创建对话框先要在项目上右键,选项【addNew】选择【QT】点击【QT设计师】,我们这里选择最后一个最为界面框架

C/C++ QT实现自定义对话框的方法是什么

默认情况下,QT会生成三个文件【.ui 界面库】【.h 头文件】【.cpp 源文件】名字相同的三个文件,对应一个界面。

C/C++ QT实现自定义对话框的方法是什么

设计好界面布局,然后开始写代码。

C/C++ QT实现自定义对话框的方法是什么

dialogsize.h

#ifndef DIALOGSIZE_H#define DIALOGSIZE_H#include <QDialog>namespace Ui {class DialogSize;}class DialogSize : public QDialog{    Q_OBJECTpublic:    explicit DialogSize(QWidget *parent = nullptr);    ~DialogSize();    int rowCount();                         // 获取对话框输入的行数    int columnCount();                      // 获取对话框输入的列数    void etRowColumn(int row, int column);  // 初始对话框上两个SpinBox的值private:    Ui::DialogSize *ui;};#endif // DIALOGSIZE_H

dialogsize.cpp

#include "dialogsize.h"#include "ui_dialogsize.h"DialogSize::DialogSize(QWidget *parent) :QDialog(parent),ui(new Ui::DialogSize){    ui->setupUi(this);}DialogSize::~DialogSize(){    delete ui;}// 主窗体调用获取当前行数int DialogSize::rowCount(){    return  ui->spinBoxRow->value();}// 主窗体调用获取当前列数int DialogSize::columnCount(){    return  ui->spinBoxColumn->value();}// 设置主窗体中的TableView行数与列数void DialogSize::setRowColumn(int row, int column){    ui->spinBoxRow->setValue(row);    ui->spinBoxColumn->setValue(column);}

mainwindow.cpp 主窗体中按钮一被点击时执行。

// 当按钮1被点击触发void MainWindow::on_pushButton_clicked(){    DialogSize *ptr = new DialogSize(this);     // 创建一个对话框    Qt::WindowFlags flags = ptr->windowFlags(); // 需要获取返回值    ptr->setWindowFlags(flags | Qt::MSwindowsFixedSizeDialogHint);  // 设置对话框固定大小    ptr->setRowColumn(model->rowCount(),model->columnCount());      // 对话框数据初始化    int ref = ptr->exec();             // 以模态方式显示对话框    if (ref==QDialog::Accepted)        // OK键被按下,对话框关闭    {        // 当BtnOk被按下时,则设置对话框中的数据        int cols=ptr->columnCount();        model->setColumnCount(cols);        int rows=ptr->rowCount();        model->setRowCount(rows);    }        // 最后删除释放对话框句柄    delete ptr;}

配置完后,我们还需要绑定两个槽函数,首先来到dialog窗体上,手动添加两条槽函数,当按钮被点击后,后发送一个信号,主窗体接收到后处理即可。

C/C++ QT实现自定义对话框的方法是什么

运行效果如下,这是一个模态对话框,所谓模态就是说,当打开时不能再次操作主窗体,只有模态对话框关闭时才能继续操作主窗体。

C/C++ QT实现自定义对话框的方法是什么

接着来写一个非模态对话框,这次创建一个Dialog名字就叫做DialogHead并绘制好界面。

C/C++ QT实现自定义对话框的方法是什么

dialoghead.h

#ifndef DIALOGHEAD_H#define DIALOGHEAD_H#include <QDialog>#include <QStringListModel>namespace Ui {class DialogHead;}class DialogHead : public QDialog{    Q_OBJECTpublic:    explicit DialogHead(QWidget *parent = nullptr);    ~DialogHead();    void setHeaderList(QStringList& headers);   // 设置表头数据    QStringList headerList();                   // 返回表头数据private:    QStringListModel *model;       // 定义数据模型    Ui::DialogHead *ui;};#endif // DIALOGHEAD_H

dialoghead.cpp

#include "dialoghead.h"#include "ui_dialoghead.h"DialogHead::DialogHead(QWidget *parent) :QDialog(parent),ui(new Ui::DialogHead){    ui->setupUi(this);    model = new QStringListModel;    ui->listView->setModel(model);}DialogHead::~DialogHead(){    delete ui;}// 设置当前listView中的数据void DialogHead::setHeaderList(QStringList &headers){    model->setStringList(headers);}// 返回当前的表头QStringList DialogHead::headerList(){    return model->stringList();}

mainwindow.cpp

// 对话框设置表头数据void MainWindow::on_pushButton_2_clicked(){    DialogHead *ptr = new DialogHead(this);    Qt::WindowFlags flags = ptr->windowFlags();    ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);    // 如果表头列数变化,则从新初始化    if(ptr->headerList().count() != model->columnCount())    {        QStringList strList;        // 获取现有的表头标题        for (int i=0;i<model->columnCount();i++)        {            strList.append(model->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString());        }        // 用于对话框初始化显示        ptr->setHeaderList(strList);    }    int ref = ptr->exec();  // 调用弹窗    if(ref==QDialog::Accepted)    {        QStringList strList=ptr->headerList();//获取对话框上修改后的StringList        model->setHorizontalHeaderLabels(strList);// 设置模型的表头标题    }    delete ptr;}

最后在Dialog上绑定信号与曹。

C/C++ QT实现自定义对话框的方法是什么

前面的交互都是使用传统的相互引用实现的,实现起来较复杂,同样可以使用信号与曹来实现,将信号与曹关联起来,在进行操作时发送信号,槽函数接受并相应。

实现多窗体设计

多窗体分为窗体卡和MID窗体,这两种窗体也最常用。

首先是窗体卡片,这里在创建是应该选择Widget窗体,这个窗体最干净没啥控件,所以我们选择它。

C/C++ QT实现自定义对话框的方法是什么

fORMdoc.h

#ifndef FORMDOC_H#define FORMDOC_H#include <QWidget>namespace Ui {class FormDoc;}class FormDoc : public QWidget{    Q_OBJECTpublic:    explicit FormDoc(QWidget *parent = nullptr);    ~FormDoc();private:    Ui::FormDoc *ui;};#endif // FORMDOC_H

formdoc.cpp

#include "formdoc.h"#include "ui_formdoc.h"#include "mainwindow.h"#include <QVBoxLayout>#include <iostream>FormDoc::FormDoc(QWidget *parent) :    QWidget(parent),    ui(new Ui::FormDoc){    ui->setupUi(this);    QVBoxLayout *Layout = new QVBoxLayout();    Layout->setContentsMargins(2,2,2,2);    Layout->setSpacing(2);    this->setLayout(Layout);    MainWindow *parWind = (MainWindow*)parentWidget(); //获取父窗口指针    QString ref = parWind->GetTableNumber();           // 获取选中标签索引    std::cout << ref.toStdString().data() << std::endl;}FormDoc::~FormDoc(){    delete ui;}

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "formdoc.h"QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = nullptr);    ~MainWindow();    QString GetTableNumber();private slots:    void on_pushButton_clicked();    void on_tabWidget_tabCloseRequested(int index);    void on_tabWidget_currentChanged(int index);private:    Ui::MainWindow *ui;};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"#include <iostream>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){    ui->setupUi(this);    ui->tabWidget->setVisible(false);    ui->tabWidget->clear();//清除所有页面    ui->tabWidget->tabsClosable(); //Page有关闭按钮,可被关闭}MainWindow::~MainWindow(){    delete ui;}// 定义函数来获取当前Table名字QString MainWindow::GetTableNumber(){    QString ref = QString(ui->tabWidget->currentIndex());    return ref;}void MainWindow::on_pushButton_clicked(){    FormDoc *ptr = new FormDoc(this);                // 新建选项卡    ptr->setAttribute(Qt::WA_DeleteOnClose);         // 关闭时自动销毁    int cur = ui->tabWidget->addTab(ptr,QString::asprintf(" 192.168.1.%d",ui->tabWidget->count()));    ui->tabWidget->setTabIcon(cur,QIcon(":/image/1.ico"));    ui->tabWidget->setCurrentIndex(cur);    ui->tabWidget->setVisible(true);}// 关闭Tab时执行void MainWindow::on_tabWidget_tabCloseRequested(int index){    if (index<0)        return;    QWidget* aForm=ui->tabWidget->widget(index);    aForm->close();}// 在无Tab页面是默认禁用void MainWindow::on_tabWidget_currentChanged(int index){    Q_UNUSED(index);    bool en=ui->tabWidget->count()>0;    ui->tabWidget->setVisible(en);}

C/C++ QT实现自定义对话框的方法是什么

实现美观对话框,前两个对话框只能弹出一次,最后一个对话框可以弹出多次,主要代码如下。

#include "mainwindow.h"#include "ui_mainwindow.h"#include <iostream>#include "formmain.h"#include "formoption.h"#include "formcharts.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){    ui->setupUi(this);    ui->tabWidget->setVisible(false);    ui->tabWidget->clear();        //清除所有页面    ui->tabWidget->tabsClosable(); //Page有关闭按钮,可被关闭    ui->tabWidget->setTabposition(QTabWidget::North);       // 设置选项卡方位    ui->tabWidget->setIconSize(QSize(50, 25));              // 设置图标整体大小    //ui->tabWidget->setTabShape(QTabWidget::Triangular);   // 设置选项卡形状    ui->tabWidget->setMovable(true);                        // 设置选项卡是否可拖动    ui->tabWidget->usesScrollButtons();                     // 选项卡滚动    ui->toolBar->setMovable(false);}MainWindow::~MainWindow(){    delete ui;}// 首页菜单创建void MainWindow::on_actionMain_triggered(){    int tab_count = ui->tabWidget->count();    int option_count = 0;    for(int x=0; x < tab_count; x++)    {        // 获取出每个菜单的标题        QString tab_name = ui->tabWidget->tabText(x);        if(tab_name == "首页菜单")            option_count = option_count + 1;    }    if(option_count < 1)    {        FormMain *ptr = new FormMain(this);              // 新建选项卡        ptr->setAttribute(Qt::WA_DeleteOnClose);         // 关闭时自动销毁        int cur=ui->tabWidget->addTab(ptr,QString::asprintf("首页菜单"));        ui->tabWidget->setTabIcon(cur,QIcon(":/image/1.ico"));        ui->tabWidget->setCurrentIndex(cur);        ui->tabWidget->setVisible(true);    }}// 创建系统设置菜单void MainWindow::on_actionOption_triggered(){    int tab_count = ui->tabWidget->count();    int option_count = 0;    for(int x=0; x < tab_count; x++)    {        // 获取出每个菜单的标题        QString tab_name = ui->tabWidget->tabText(x);        if(tab_name == "系统设置")            option_count = option_count + 1;    }    // 判断首页菜单是否只有一个,可判断标签个数来识别    if(option_count < 1)    {        FormOption *ptr = new FormOption(this);        ptr->setAttribute(Qt::WA_DeleteOnClose);        int cur = ui->tabWidget->addTab(ptr,QString::asprintf("系统设置"));        ui->tabWidget->setTabIcon(cur,QIcon(":/image/2.ico"));        ui->tabWidget->setCurrentIndex(cur);        ui->tabWidget->setVisible(true);    }}// 绘图页面的弹出void MainWindow::on_actionCharts_triggered(){    FormCharts *ptr = new FormCharts(this);    ptr->setAttribute(Qt::WA_DeleteOnClose);    int cur = ui->tabWidget->addTab(ptr,QString::asprintf("图形绘制"));    ui->tabWidget->setTabIcon(cur,QIcon(":/image/3.ico"));    ui->tabWidget->setCurrentIndex(cur);    ui->tabWidget->setVisible(true);}// 关闭TabWiget时void MainWindow::on_tabWidget_tabCloseRequested(int index){    if (index<0)        return;    QWidget* aForm=ui->tabWidget->widget(index);    aForm->close();}

C/C++ QT实现自定义对话框的方法是什么

感谢各位的阅读,以上就是“C/C++ QT实现自定义对话框的方法是什么”的内容了,经过本文的学习后,相信大家对C/C++ QT实现自定义对话框的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C/C++ QT实现自定义对话框的方法是什么

本文链接: https://www.lsjlt.com/news/300599.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作