www技术支持 重庆网站建设/怎么推广网页

www技术支持 重庆网站建设,怎么推广网页,如何阿里巴巴网站做推广方案,有没有找人做标书的网站一 对话框 实现功能&#xff1a;打开文件&#xff0c;选择目录&#xff0c;保存文件&#xff0c;选择颜色&#xff0c;选择字体&#xff0c;输入信息&#xff0c; 消息提示框 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE na…

一 对话框

  • 实现功能:打开文件,选择目录,保存文件,选择颜色,选择字体,输入信息,
    消息提示框
    在这里插入图片描述
    在这里插入图片描述
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButtonSelectOneFile_clicked();void on_pushButtonSelectMultiFile_clicked();void on_pushButtonSelectRoot_clicked();void on_pushButtonSaveFile_clicked();void on_pushButtonColor_clicked();void on_pushButtonFont_clicked();void on_pushButtonInputString_clicked();void on_pushButtonInputInt_clicked();void on_pushButtonInputFloat_clicked();void on_pushButtonSelectItem_clicked();void on_pushButtonQuestion_clicked();void on_pushButtonMessage_clicked();void on_pushButtonWarning_clicked();void on_pushButtonWarningSerious_clicked();void on_pushButtonVersion_clicked();void on_pushButtonVersionQT_clicked();void on_pushButton_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QTextStream>
#include <QColorDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButtonSelectOneFile_clicked()
{QString filename = QFileDialog::getOpenFileName(this,"选择一个文件",QDir::currentPath(),"文本文件(*txt);;C/C++文件(*.h *.c *.cpp);; 图片文件(*.jpg *.png *.gif);;所有文件(*.*)");if(!filename.isEmpty()){ui->plainTextEdit->appendPlainText(filename);}
}void MainWindow::on_pushButtonSelectMultiFile_clicked()
{QStringList filename = QFileDialog::getOpenFileNames(this,"选择多个文件",QDir::currentPath(),"文本文件(*txt);;C/C++文件(*.h *.c *.cpp);; 图片文件(*.jpg *.png *.gif);;所有文件(*.*)");if(filename.count() > 0){for(int i = 0; i < filename.count() ; i++)ui->plainTextEdit->appendPlainText(filename[i]);}
}void MainWindow::on_pushButtonSelectRoot_clicked()
{QString filename = QFileDialog::getExistingDirectory(this,"选择一个目录",QDir::currentPath(),QFileDialog::ShowDirsOnly);if(!filename.isEmpty()){ui->plainTextEdit->appendPlainText(filename);}
}void MainWindow::on_pushButtonSaveFile_clicked()
{QString filename = QFileDialog::getSaveFileName(this,"保存文件",QDir::currentPath(),"文本文件(*txt);;C/C++文件(*.h *.c *.cpp);; 图片文件(*.jpg *.png *.gif);;所有文件(*.*)");if(!filename.isEmpty()){//把文本编辑器的内容保存到文本QFile qfile(filename);if(! qfile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){return;}QTextStream stream(&qfile);stream << ui->plainTextEdit->toPlainText();qfile.close();ui->plainTextEdit->appendPlainText("已保存到:" + filename);}
}void MainWindow::on_pushButtonColor_clicked()
{QPalette pal = ui->plainTextEdit->palette(); //获取文本框的调色板QColor textColor = pal.color(QPalette::Text);  //获取文本框里面的本文的颜色//调用颜色对话框QColor color = QColorDialog::getColor(textColor,  //初始颜色this,       //父窗口"选择文本颜色");  //显示信息if(color.isValid()){pal.setColor(QPalette::Text,color);ui->plainTextEdit->setPalette(pal);}
}void MainWindow::on_pushButtonFont_clicked()
{QFont currentFont = ui->plainTextEdit->font();bool ok = false;//调用字体选择对话框QFont font = QFontDialog::getFont(&ok,currentFont);if(ok){ui->plainTextEdit->setFont(font);}
}void MainWindow::on_pushButtonInputString_clicked()
{bool ok = false;//QLineEdit::Normal:一边输入一边显示//QLineEdit::NoEcho 输入不显示,如密码//QLineEdit::Password  密码输入方式,输入的时候显示掩码,离开显示星号QString str = QInputDialog::getText(this,"输入文本对话框","请输入姓名:",QLineEdit::Normal,"ROOK",   //默认输入&ok); //是否输入成功if(ok && !str.isEmpty()){ui->plainTextEdit->appendPlainText(str);}
}void MainWindow::on_pushButtonInputInt_clicked()
{bool ok = false;int value = QInputDialog::getInt(this,"输入整数对话框","请输入字体大小:",ui->plainTextEdit->font().pointSize(),   //默认输入10,80,  //输入整数的最大最小值1,&ok); //是否输入成功if(ok){QFont font = ui->plainTextEdit->font();font.setPointSize(value);ui->plainTextEdit->setFont(font);}
}void MainWindow::on_pushButtonInputFloat_clicked()
{bool ok = false;double value = QInputDialog::getDouble(this,"输入浮点数对话框","请输入一个浮点数:",3.14,   //默认输入1.0,100,  //输入整数的最大最小值2,  //小数点后面位数&ok); //是否输入成功if(ok){QString str = QString::asprintf("输入了以恶搞浮点数:%.2f",value);ui->plainTextEdit->appendPlainText(str);}
}void MainWindow::on_pushButtonSelectItem_clicked()
{bool ok = false;QStringList items = {"软件工程师","硬件工程师","测试工程师"};QString str = QInputDialog::getItem(this,"列表选择对话框","请选择岗位:",items, //有哪些可选项1,  //默认选项true, //是否可编辑&ok);if(ok && !str.isEmpty()){ui->plainTextEdit->appendPlainText(str);}
}void MainWindow::on_pushButtonQuestion_clicked()
{QMessageBox::StandardButton ret = QMessageBox::question(this,"问题消息框","内容已经修改,是否保存", //提示的内容QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,QMessageBox::NoButton);  //默认选项if(ret == QMessageBox::Yes){ui->plainTextEdit->appendPlainText("已选择: Yes");}else if(ret == QMessageBox::No){ui->plainTextEdit->appendPlainText("已选择: No");}else if(ret == QMessageBox::Cancel){ui->plainTextEdit->appendPlainText("已选择: 取消");}else{ui->plainTextEdit->appendPlainText("未选择");}
}void MainWindow::on_pushButtonMessage_clicked()
{QMessageBox::information(this,"消息提示框","文件已经保存!", //提示的内容QMessageBox::Ok,QMessageBox::NoButton);  //默认选项
}void MainWindow::on_pushButtonWarning_clicked()
{QMessageBox::warning(this,"消息提示框","文件被篡改!");  //默认选项
}void MainWindow::on_pushButtonWarningSerious_clicked()
{QMessageBox::critical(this,"危机消息提示框","系统即将重启!");  //默认选项
}void MainWindow::on_pushButtonVersion_clicked()
{QMessageBox::about(this,"About消息提示框","hahahha!");  //默认选项
}void MainWindow::on_pushButtonVersionQT_clicked()
{QMessageBox::aboutQt(this,"aboutQt消息提示框");  //默认选项
}void MainWindow::on_pushButton_clicked()
{ui->plainTextEdit->clear();
}

二 自定义对话框 使用类对象的对外的接口完成窗口之间的通讯

在这里插入图片描述
在这里插入图片描述

2.1 调整行列的自定义对话框

  • 步骤:Add new->新建设计师类()->设计当前类的窗口样式->定义接口
  • 功能:单击调整行列按钮,弹出对话框,修改spinbox中对应的行列数,点击确定,对应表格中的行列会发生变化
  • mainwindow.h 主函数调用的时候,需要包含该类的头文件#include "dialogresize.h",定义接口
  • 知识点:点击确定按钮,或者关闭按钮,如果不需要,实现的时候 accept()或者reject() / close()即可
private:Ui::MainWindow *ui;DialogResize *dialogResize;DialogHeader *dialogHeader;DialogLocation *dialogLocation;

在这里插入图片描述
“dialogresize.h”

#ifndef DIALOGRESIZE_H
#define DIALOGRESIZE_H#include <QDialog>namespace Ui {
class DialogResize;
}class DialogResize : public QDialog
{Q_OBJECTpublic:explicit DialogResize(QWidget *parent = nullptr);~DialogResize();int getRow();int getCol();
private slots:void on_pushButtonok_clicked();void on_pushButtonCancle_clicked();private:Ui::DialogResize *ui;
};#endif // DIALOGRESIZE_H

“dialogresize.cpp”

#include "dialogresize.h"
#include "ui_dialogresize.h"DialogResize::DialogResize(QWidget *parent) :QDialog(parent),ui(new Ui::DialogResize)
{ui->setupUi(this);
}DialogResize::~DialogResize()
{delete ui;
}int DialogResize::getRow()
{return ui->spinBoxRow->value();
}int DialogResize::getCol()
{return ui->spinBoxCol->value();
}void DialogResize::on_pushButtonok_clicked()
{accept();
}void DialogResize::on_pushButtonCancle_clicked()
{reject();
}

2.2 编辑表头按钮

  • 功能:点击编辑表头按钮,对话框中会同步显示出已有的表头信息,如果在对话框中编辑表头,点击确定,那么对话框将关闭,对应的表的表头也将发生变化
  • 知识点1:在当前的设计师类中,新建了一个QStringListModel,因为对话框里面使用了listview
  • 知识点2QStringListModel模型获取listview中的字符串,用语句 model->stringList();,设置listview中的字符串,用语句model->setStringList(list);
    在这里插入图片描述
#ifndef DIALOGEDITHEAD_H
#define DIALOGEDITHEAD_H#include <QDialog>
#include <QStringListModel>namespace Ui {
class DialogEditHead;
}class DialogEditHead : public QDialog
{Q_OBJECTpublic:explicit DialogEditHead(QWidget *parent = nullptr);~DialogEditHead();void setHeadList(const QStringList& list);QStringList getHeaderList();private slots:void on_pushButtonOk_clicked();void on_pushButtonOk_2_clicked();private:Ui::DialogEditHead *ui;QStringListModel *model;
};#endif // DIALOGEDITHEAD_H
#include "dialogedithead.h"
#include "ui_dialogedithead.h"DialogEditHead::DialogEditHead(QWidget *parent) :QDialog(parent),ui(new Ui::DialogEditHead)
{ui->setupUi(this);model = new QStringListModel;ui->listView->setModel(model);
}DialogEditHead::~DialogEditHead()
{delete ui;
}void DialogEditHead::setHeadList(const QStringList &list)
{model->setStringList(list);
}void DialogEditHead::on_pushButtonOk_clicked()
{accept();
}void DialogEditHead::on_pushButtonOk_2_clicked()
{reject();
}QStringList DialogEditHead::getHeaderList()
{return model->stringList();
}

2.3 定位按钮

  • 功能:点击定位单元格,弹出对话框,会显示当前单元格对应的位置,在对话框中输入文本,点击确定,文本会更新在相应的单元格里面
  • 知识点1:一般情况,按钮单击之后,会变成灰色 void showEvent(QShowEvent *event);,不会再变成原有的黑色,如果希望实现对话框关闭时,相应的按钮恢复成黑色,也就是恢复成可点击状态,添加函数void closeEvent(QCloseEvent *);
  • 知识点2:通过对话框,更新主窗口的内容,需要定义主窗口的接口,同时在mainwindow函数中自定义相应的接口,setCellText就是在mainwindow函数中自定义的公共函数接口
     MainWindow *mainwindow = (MainWindow*)parentWidget();mainwindow->setCellText(ui->spinBoxRow->value(),ui->spinBoxCol->value(),ui->plainTextEdit->toPlainText());

在这里插入图片描述

#ifndef DIALOGLOCATION_H
#define DIALOGLOCATION_H#include <QDialog>namespace Ui {
class DialogLocation;
}class DialogLocation : public QDialog
{Q_OBJECTpublic:explicit DialogLocation(QWidget *parent = nullptr);~DialogLocation();void setCurrentColRow(int row, int col);void setRowColMax(int maxRow, int maxCol);private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::DialogLocation *ui;//窗口关闭的时候调用这个函数void closeEvent(QCloseEvent *event);void showEvent(QShowEvent *event);};#endif // DIALOGLOCATION_H
#include "dialoglocation.h"
#include "ui_dialoglocation.h"
#include "mainwindow.h"
DialogLocation::DialogLocation(QWidget *parent) :QDialog(parent),ui(new Ui::DialogLocation)
{ui->setupUi(this);
}DialogLocation::~DialogLocation()
{delete ui;
}void DialogLocation::setCurrentColRow(int row, int col)
{ui->spinBoxCol->setValue(col);ui->spinBoxRow->setValue(row);
}void DialogLocation::setRowColMax(int maxRow, int maxCol)
{ui->spinBoxRow->setMaximum(maxRow-1);ui->spinBoxCol->setMaximum(maxCol-1);
}void DialogLocation::showEvent(QShowEvent *event){//把主窗口的定位组件再次设置为可以点击MainWindow *mainwindow = (MainWindow*)parentWidget();mainwindow->setActionLocationEnable(false);}void DialogLocation::closeEvent(QCloseEvent * )
{//把主窗口的定位组件再次设置为可以点击MainWindow *mainwindow = (MainWindow*)parentWidget();mainwindow->setActionLocationEnable(true);
}void DialogLocation::on_pushButton_clicked()
{//将指定位置的表格的内容设置为plaintext中的内容MainWindow *mainwindow = (MainWindow*)parentWidget();mainwindow->setCellText(ui->spinBoxRow->value(),ui->spinBoxCol->value(),ui->plainTextEdit->toPlainText());//列自增和行自增的框的相应实现if(ui->checkBoxRow->isChecked()){ui->spinBoxRow->setValue(ui->spinBoxRow->value() + 1);}if(ui->checkBoxCol->isChecked()){ui->spinBoxCol->setValue(ui->spinBoxCol->value() + 1);}
}void DialogLocation::on_pushButton_2_clicked()
{//reject(); //不会真正关闭对话框,不触发closeEvent,导致关闭对话框之后,标题栏的按钮没有恢复可点击状态close();
}

2.4 MainWindow函数

2.4.1 知识点1:新建对话框的方式有3种,
DialogResize *dialogresize = new DialogResize(this);
。。。。//删除对话框delete dialogresize;
dialogLocation = new DialogLocation(this);
    if(dialogHead == NULL){//只创建一次,可以重复使用dialogHead = new DialogEditHead(this); //这种调用方式,不需要delete,this是父节点,关闭的时候会同时关闭子节点}
2.4.2 知识点2:模态显示2种,一种是打开当前操作,其余地方不允许操作;另一种是其他地方允许操作

其它地方不允许操作

    //把自定义的对话框显示出来int ret = dialogresize->exec(); //模态显示,当前对话框工作,其他地方不允许操作if(ret == QDialog::Accepted){ //点击了确定按钮,。。。。}

其它地方允许操作

dialogLocation->show(); //以非模态方式显示
2.4.3 知识点3:获取tabelview模型种当前单元格的行列
QModelIndex index = selectionModel->currentIndex();
index.row(),
index.column()
2.4.4 获取表头信息
    QStringList list;for(int i =0; i < model->columnCount(); i++){list.append(model->headerData(i,Qt::Horizontal).toString());}

函数实现

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include "dialogedithead.h"
#include "dialoglocation.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void setActionLocationEnable(bool enable);void setCellText(int row, int col, QString text);
private slots:void on_actionResize_triggered();void on_actionEditHead_triggered();void on_actionLocation_triggered();private:Ui::MainWindow *ui;QStandardItemModel *model;QItemSelectionModel *selectionModel;DialogEditHead *dialogHead = NULL;DialogLocation *dialogLocation = NULL;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogresize.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setCentralWidget(ui->tableView);model = new QStandardItemModel(10,6,this);selectionModel = new QItemSelectionModel(model);ui->tableView->setModel(model);ui->tableView->setSelectionModel(selectionModel);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::setActionLocationEnable(bool enable)
{ui->actionLocation->setEnabled(enable);
}void MainWindow::setCellText(int row, int col, QString text)
{//清除原来的选择项selectionModel->clearSelection();selectionModel->setCurrentIndex(model->index(row,col),QItemSelectionModel::Select);model->setData(model->index(row,col),text);
}void MainWindow::on_actionResize_triggered()
{DialogResize *dialogresize = new DialogResize(this);//固定对话框大小,不允许拉伸dialogresize->setWindowFlags(dialogresize->windowFlags() |Qt::MSWindowsFixedSizeDialogHint);//获取模型的当前的行列数,设置到自定义对话框,作为默认值显示dialogresize->setRowCount(model->rowCount());dialogresize->setColCount(model->columnCount());//把自定义的对话框显示出来int ret = dialogresize->exec(); //模态显示,当前对话框工作,其他地方不允许操作if(ret == QDialog::Accepted){ //点击了确定按钮int rows = dialogresize->rowCount();int cols = dialogresize->colCount();//改变tabelview的大小model->setRowCount(rows);model->setColumnCount(cols);}//删除对话框delete dialogresize;
}void MainWindow::on_actionEditHead_triggered()
{if(dialogHead == NULL){//只创建一次,可以重复使用dialogHead = new DialogEditHead(this); //这种调用方式,不需要delete,this是父节点,关闭的时候会同时关闭子节点}//将tabelview的表头都传递给这个对话框QStringList list;for(int i =0; i < model->columnCount(); i++){list.append(model->headerData(i,Qt::Horizontal).toString());}dialogHead->setHeadList(list);int ret = dialogHead->exec();if(ret == QDialog::Accepted){QStringList list = dialogHead->getHeaderList();model->setHorizontalHeaderLabels(list);}
}void MainWindow::on_actionLocation_triggered()
{ui->actionLocation->setEnabled(false); //一次只允许创建一个窗口//不同的新建方式dialogLocation = new DialogLocation(this);//设置窗口样式 显示在最顶层,这样不会被其他窗口覆盖dialogLocation->setWindowFlags(dialogLocation->windowFlags() |Qt::WindowStaysOnTopHint);//传递数据dialogLocation->setRowColMax(model->rowCount(),model->columnCount());QModelIndex index = selectionModel->currentIndex();if(index.isValid()){dialogLocation->setCurrentColRow(index.row(), index.column());}dialogLocation->show(); //以非模态方式显示}

三 自定义对话框 使用信号槽完成窗口之间的通讯

补充
在这里插入图片描述

  • 知识点:两个窗口之间的通讯,需要定义信号和槽函数,信号一般定义在发送信号的窗口里面,槽函数一般定义在接收信号的窗口里面,在二案例的例子的基础上,对DialogLocation类进行修改,将类对象接口的通讯方式修改为信号与槽之间的通讯
  • 步骤1:点击对话框的确定按钮,要发送信号;单击定位单元格按钮之后,要求图标变成灰色,关闭单元格之后,要求突变恢复黑色,因此当前操作需要发送两个信号,在DialogLocation类中添加信号,信号不需要做实现
//信号定义在信号发送者
signals:void setCellText(int row, int col,  QString  &text);void setActionEnable(bool enable);
  • 步骤2:在mainwindow.h中添加信号槽,重点:由于是不同窗口之间的信号传递,接口需要定义成public类型的
//槽函数定义在信号的接收者,因为是其它窗口信号和当前窗口的槽函数关联
public slots:void setCellText2(int row, int col,  QString  &text);void setActionEnable2(bool enable);
  • 步骤3:槽函数的实现,在对应的按键,也即控制对话框弹出的按钮里面进行信号的关联,在之前的代码上没有任何改动,只是对信号进行了连接
void MainWindow::on_actionLocation_triggered()
{ui->actionLocation->setEnabled(false); //一次只允许创建一个窗口//不同的新建方式dialogLocation = new DialogLocation(this);//设置窗口样式 显示在最顶层,这样不会被其他窗口覆盖dialogLocation->setWindowFlags(dialogLocation->windowFlags() |Qt::WindowStaysOnTopHint);//传递数据dialogLocation->setRowColMax(model->rowCount(),model->columnCount());QModelIndex index = selectionModel->currentIndex();if(index.isValid()){dialogLocation->setCurrentColRow(index.row(), index.column());}//关联connect(dialogLocation, SIGNAL(setCellText(int, int ,QString &)),this,SLOT(setCellText2(int, int ,QString &)));connect(dialogLocation, SIGNAL(setActionEnable(bool)),this,SLOT(setActionEnable2(bool)));dialogLocation->show(); //以非模态方式显示}
  • 步骤4:在自定义窗口类中,发送信号
void DialogLocation::closeEvent(QCloseEvent * event)
{//把主窗口的定位组件再次设置为可以点击
//    MainWindow *mainwindow = (MainWindow*)parentWidget();
//    mainwindow->setActionLocationEnable(true);emit setActionEnable(true);
}void DialogLocation::showEvent(QShowEvent *event){//把主窗口的定位组件再次设置为可以点击
//    MainWindow *mainwindow = (MainWindow*)parentWidget();
//    mainwindow->setActionLocationEnable(false);emit setActionEnable(false);
}void DialogLocation::on_pushButton_clicked()
{
//    //将指定位置的表格的内容设置为plaintext中的内容
//     MainWindow *mainwindow = (MainWindow*)parentWidget();
//     mainwindow->setCellText(ui->spinBoxRow->value(),
//                             ui->spinBoxCol->value(),
//                             ui->plainTextEdit->toPlainText());QString text = ui->plainTextEdit->toPlainText();emit setCellText(ui->spinBoxRow->value(),ui->spinBoxCol->value(),text);//列自增和行自增的框的相应实现if(ui->checkBoxRow->isChecked()){ui->spinBoxRow->setValue(ui->spinBoxRow->value() + 1);}if(ui->checkBoxCol->isChecked()){ui->spinBoxCol->setValue(ui->spinBoxCol->value() + 1);}
}

四 多窗口开发 —类似WPS的同时可以打开多个窗口

  • Qt主要窗口类
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4.1 案例实现功能

在这里插入图片描述
在这里插入图片描述

  • formedit.h
#ifndef FORMEDIT_H
#define FORMEDIT_H#include <QWidget>namespace Ui {
class FormEdit;
}class FormEdit : public QWidget
{Q_OBJECTpublic:explicit FormEdit(QWidget *parent = nullptr);~FormEdit();private:Ui::FormEdit *ui;
};#endif // FORMEDIT_H
  • formedit.cpp
#include "formedit.h"
#include "ui_formedit.h"
#include <QToolBar>
#include <QVBoxLayout>FormEdit::FormEdit(QWidget *parent) :QWidget(parent),ui(new Ui::FormEdit)
{ui->setupUi(this);//设计器里面没有toolbox,手动创建QToolBar *bar  = new QToolBar(this);bar->addAction(ui->actionOpen);bar->addSeparator();bar->addAction(ui->actionFont);bar->addAction(ui->actionCut);bar->addAction(ui->actionCopy);bar->addAction(ui->actionPsate);bar->addAction(ui->actionCancle);bar->addAction(ui->actionRepeat);bar->addSeparator();bar->addAction(ui->actionClose);bar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);//代码布局 plaintextEdit ,不能手动布局,否则手动添加的按钮没有位置了QVBoxLayout *layout = new QVBoxLayout();layout->addWidget(bar);layout->addWidget(ui->plainTextEdit);this->setLayout(layout);}FormEdit::~FormEdit()
{delete ui;
}
  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();
private slots://void tabCloseRequested(int index);void on_tabWidget_tabCloseRequested(int index);void on_action_insideWidget_triggered();void on_action_widget_triggered();void on_action_insisdeMainwindow_triggered();void on_action_mainwindow_triggered();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
  • mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include  "formedit.h"
#include "mainwindow2.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->tabWidget->clear();  //清除tabWidget中的默认选项//让tab子窗口可关闭,有关闭按钮,但不会自动关闭,点击按钮会发送信号,需要自定义槽函数ui->tabWidget->setTabsClosable(true);//设置主窗口的默认状态是最大化this->setWindowState(Qt::WindowMaximized);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_tabWidget_tabCloseRequested(int index)
{//获取对应的窗口QWidget *widget = ui->tabWidget->widget(index);widget->close();}void MainWindow::on_action_insideWidget_triggered()
{FormEdit *form = new FormEdit(this);form->setAttribute(Qt::WA_DeleteOnClose);  //设置窗体关闭时,自动销毁资源//将当前的表插入tabWidget,index是对应窗口的序号int index = ui->tabWidget->addTab(form,QString::asprintf("窗口%d",ui->tabWidget->count()+1));ui->tabWidget->setCurrentIndex(index);}void MainWindow::on_action_widget_triggered()
{FormEdit *form = new FormEdit(this);form->setAttribute(Qt::WA_DeleteOnClose);  //设置窗体关闭时,自动销毁资源form->setWindowTitle("基于widget的独立窗口");form->setWindowFlag(Qt::Window, true);  //这一行必须加,否则显示的独立窗口没有边框form->show();
}void MainWindow::on_action_insisdeMainwindow_triggered()
{MainWindow2 *window = new MainWindow2(this);window->setAttribute(Qt::WA_DeleteOnClose);int index = ui->tabWidget->addTab(window,QString::asprintf("窗口%d",ui->tabWidget->count()+1));ui->tabWidget->setCurrentIndex(index);
}void MainWindow::on_action_mainwindow_triggered()
{MainWindow2 *window = new MainWindow2(this);window->setAttribute(Qt::WA_DeleteOnClose);  //设置窗体关闭时,自动销毁资源window->setWindowTitle("基于MainWindow2的独立窗口");window->setWindowFlag(Qt::Window, true);  //这一行必须加,否则显示的独立窗口没有边框window->show();
}
  • 其余文件代码见案例三,没有改动

4.2 案例4.1知识点总结

4.2.1 案例4.1的代码,是创建新的项目,完成formedit.h函数及其实现之后,直接将案例三中的代码合成添加到当前案例,在此合成过程中,两个案例中都有mainwindow同名函数,因此案例三中的该函数需要修改名字
  • 直接将案例三中涉及mainwindow的位置都修改成mainwindow2Mainwindow2,声明#ifndef MAINWINDOW2_H , #define MAINWINDOW2_H,头文件#include "mainwindow2.h"都要进行相应的修改
  • 另外,mainwindow2.ui文件也要进行修改,选中该文件->在explorer中显示->找到mainwindow2.ui->用记事本打开->修改如下对应位置,注意此处不是所有的都改,只改一个地方
    在这里插入图片描述
  • 选中项目文件名untitled27->添加现有文件->将案例三中的.cpp文件,.ui 文件,以及.h文件,案例三共有12个文件,导入当前项目即可,在案例四中调用案例三中的项目,直接通过MainWindow2 *window = new MainWindow2(this);创建街接口,就可以显示
4.2.2 Tab Widget的子窗口里面默认是没有关闭按钮的,需要手动建立信号槽来是实现
  • 步骤1:在mainwindow.cpp文件中的构造函数里面,添加 ui->tabWidget->setTabsClosable(true);
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->tabWidget->clear();  //清除tabWidget中的默认选项//让tab子窗口可关闭,有关闭按钮,但不会自动关闭,点击按钮会发送信号,需要自定义槽函数ui->tabWidget->setTabsClosable(true);//设置主窗口的默认状态是最大化this->setWindowState(Qt::WindowMaximized);
}
  • 步骤2:在mainwindow.h文件, 自定义信号槽 void on_tabWidget_tabCloseRequested(int index);
  • 步骤3:实现槽函数
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{//获取对应的窗口QWidget *widget = ui->tabWidget->widget(index);widget->close();
}

在这里插入图片描述

4.2.3 formedit.h是头通过新建设计师类,选择Widget来实现的,和Dialog without Buttons(案例三中使用的)不同,前者无法添加toolbox来手动拖动action,后者可以,所以当前案例的做法是,还是手动创建action以及plain text eidt,但是是在formedit.cpp中来布局和添加,不能手动布局

在这里插入图片描述
在这里插入图片描述

五 MDI开发案例 多窗口

在这里插入图片描述

  • 组件名称
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5.1 知识点总结

  • 当前项目步骤
    (1)创建一个设计师类,选择widget,对应文件名字formdoc,在对应的ui设计界面,只添加plain text edit 组件
    (2)对于mianwindow类,在ui界面添加一个MDI area组件,然后手动添加toolbox对应的action
  • 知识点1mianwindow里面的组件,实际的操作对象是formdoc里面的plain text edit 组件,所以对应的复制粘贴等选项,需要formdoc提供对外的接口,使得点击mianwindow里面的组件时能完成对文本的相关操作
  • 知识点2:MDI模式不需要手动为弹出的对话框添加取消按钮,也即每个框右上角的×

5.2 MDI模式

MDI效果图
在这里插入图片描述
非MDI效果图
在这里插入图片描述

5.3 展开模式

在这里插入图片描述

5.4 平铺模式

在这里插入图片描述

  • 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();bool fileOpen();void loadFile(const QString &filename);void cut();void paste();void copy();void setFont();private:Ui::FormDoc *ui;bool m_fileOpen = false;
};#endif // FORMDOC_H
  • formdoc.cpp
#include "formdoc.h"
#include "ui_formdoc.h"
#include <QFile>
#include <QTextStream>
#include <QFileInfo>
#include <QFontDialog>
FormDoc::FormDoc(QWidget *parent) :QWidget(parent),ui(new Ui::FormDoc)
{ui->setupUi(this);this->setAttribute(Qt::WA_DeleteOnClose);  //窗口关闭消除资源
}FormDoc::~FormDoc()
{delete ui;
}bool FormDoc::fileOpen()
{return m_fileOpen;
}void FormDoc::loadFile(const QString &filename)
{QFile file(filename);if(file.open(QIODevice::ReadOnly | QIODevice::Text)){QTextStream stream(&file);ui->plainTextEdit->clear();ui->plainTextEdit->setPlainText(stream.readAll());file.close();m_fileOpen = true;//把文件名作为窗口标题 filename是文件路径QFileInfo info(filename);QString name = info.fileName();this->setWindowTitle(name);}
}void FormDoc::cut(){ui->plainTextEdit->cut();
}void FormDoc::paste()
{ui->plainTextEdit->paste();
}void FormDoc::copy()
{ui->plainTextEdit->copy();
}void FormDoc::setFont()
{QFont font = ui->plainTextEdit->font();  //获取当前字体bool ok;font = QFontDialog:: getFont(&ok, font);ui->plainTextEdit->setFont(font);
}
  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_actionNew_triggered();void on_actionOpen_triggered();void on_actionCloseALL_triggered();void on_actionCopy_triggered();void on_actionCut_triggered();void on_actionFont_triggered();void on_actionPaste_triggered();void on_actionMDI_toggled(bool arg1);void on_actionExpand_triggered();void on_actionPing_triggered();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
  • mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "formdoc.h"
#include <QMdiSubWindow>
#include <QFileDialog>
#include  <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}//新建文档
void MainWindow::on_actionNew_triggered()
{FormDoc *form = new FormDoc(this);//把新建的床口添加到MDIui->mdiArea->addSubWindow(form);//把当前新的文档编辑窗口,以独立的窗口显示form->show();
}void MainWindow::on_actionOpen_triggered()
{//如果当前MDI没有任何子窗口,open直接创建新的子窗口//MDI当前已经有子窗口,就创新新的窗口bool newNewForm = false;FormDoc *form = NULL;if(ui->mdiArea->subWindowList().count() == 0){newNewForm  = true;}else {//去除当前激活的窗口form = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();if(form->fileOpen()){newNewForm = true;}}//打开文件对话框QString filename = QFileDialog::getOpenFileName(this, "打开一个文件", QDir::currentPath(),"源文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)");if(filename.isEmpty()){return;}if(newNewForm){FormDoc *form2 = new FormDoc(this);ui->mdiArea->addSubWindow(form2);form2->show();form2->loadFile(filename);}
}void MainWindow::on_actionCloseALL_triggered()
{ui->mdiArea->closeAllSubWindows();
}void MainWindow::on_actionCopy_triggered()
{FormDoc *form = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();form->copy();
}void MainWindow::on_actionCut_triggered()
{FormDoc *form = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();form->cut();
}void MainWindow::on_actionFont_triggered()
{FormDoc *form = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();form->setFont();
}void MainWindow::on_actionPaste_triggered()
{FormDoc *form = (FormDoc*)ui->mdiArea->activeSubWindow()->widget();form->paste();
}void MainWindow::on_actionMDI_toggled(bool check)
{if(check){ui->mdiArea->setViewMode(QMdiArea::TabbedView);ui->actionPing->setEnabled(false);ui->actionExpand->setEnabled(false);//设置MDI子窗口的tab关闭按钮可以使用ui->mdiArea->setTabsClosable(true);}else{ui->mdiArea->setViewMode(QMdiArea::SubWindowView);ui->actionPing->setEnabled(true);ui->actionExpand->setEnabled(true);}
}void MainWindow::on_actionExpand_triggered()
{ui->mdiArea->cascadeSubWindows();
}void MainWindow::on_actionPing_triggered()
{ui->mdiArea->tileSubWindows();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux部署DeepSeek r1 模型训练

之前写过一篇windows下部署deepseekR1的文章&#xff0c;有小伙伴反馈提供一篇linux下部署DeepSeek r1 模型训练教程&#xff0c;在 Linux 环境下&#xff0c;我找了足够的相关资料&#xff0c;花费了一些时间&#xff0c;我成功部署了 DeepSeek R1 模型训练任务&#xff0c;结…

嵌入式经常用到串口,如何判断串口数据接收完成?

说起通信&#xff0c;首先想到的肯定是串口&#xff0c;日常中232和485的使用比比皆是&#xff0c;数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu&#xff08;如&#xff1a;stm32f103&#xff09;在出厂时就已经在…

解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器

一、引言 在机器学习的广阔领域中&#xff0c;算法的选择犹如为一场冒险挑选趁手的武器&#xff0c;至关重要。面对海量的数据和复杂的任务&#xff0c;合适的算法能够化繁为简&#xff0c;精准地挖掘出数据背后隐藏的模式与价值。机器学习领域有十大核心算法&#xff0c;而随…

Shapr3D在ipad上无法识别鼠标点击问题

此问题我去过长沙Apple官方直营店咨询过此问题&#xff0c;官方直营店也不知道解决方案&#xff0c;遂在此提醒长沙Apple官方线下直营店的所有店员。 问题描述 1.不知道为什么在买了Magic Keyboard后还是无法识别单击触控板&#xff0c;遂为了解决这个问题我特意从江西跑到长沙…

【架构】微内核架构(Microkernel Architecture)

微内核架构(Microkernel Architecture) 核心思想 微内核架构(又称插件式架构)通过最小化核心系统,将可扩展功能以插件模块形式动态加载,实现高内聚低耦合。其核心设计原则: 核心最小化:仅封装基础通用能力(如插件管理、通信机制、安全校验)功能插件化:所有业务功能…

AI 编程助手 cursor的系统提示词 prompt

# Role 你是一名极其优秀具有10年经验的产品经理和精通java编程语言的架构师。与你交流的用户是不懂代码的初中生&#xff0c;不善于表达产品和代码需求。你的工作对用户来说非常重要&#xff0c;完成后将获得10000美元奖励。 # Goal 你的目标是帮助用户以他容易理解的…

uni-app发起网络请求的三种方式

uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header&#xff1a;设置请求的 header&#xff0c;header 中不能设置 Referer&#xff1b; method&#xff1a;请求方法&#xff1b; timeout&#xff1a;超时时间&#xff0c;单位 ms&a…

SpringBoot速成概括

视频&#xff1a;黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 图示&#xff1a;

《魔女的夜宴》无广版手游安卓苹果免费下载直装版

自娶 https://pan.xunlei.com/s/VOJS77k8NDrVawqcOerQln2lA1?pwdn6k8 《魔女的夜宴》&#xff1a;一场魔法与恋爱的奇幻之旅 在美少女游戏的世界中&#xff0c;柚子社&#xff08;Yuzusoft&#xff09;的作品总是以其精美的画面、动人的剧情和丰富的角色塑造而备受玩家喜爱…

N-bit ADC过采样和L阶噪声整形后的SQNR表达式

对于采用L阶理想高通滤波器进行噪声整形的DSM&#xff0c;OSR每增加一倍&#xff0c;SQNR提高3(2L1)dB,文中给出了DSM量化精度与量化器位数N、环路滤波器阶数L和过采样率OSR的关系&#xff0c;在进行DSM系统设计时通过设置目标SQNR即可筛选出满足设计需要的参数组合。

Linux环境开发工具

Linux软件包管理器yum Linux下安装软件方式&#xff1a; 源代码安装rpm安装——Linux安装包yum安装——解决安装源、安装版本、安装依赖的问题 yum对应于Windows系统下的应用商店 使用Linux系统的人&#xff1a;大部分是职业程序员 客户端怎么知道去哪里下载软件&#xff1…

EasyRTC:智能硬件适配,实现多端音视频互动新突破

一、智能硬件全面支持&#xff0c;轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术&#xff0c;无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统&#xff0c;并全面拥抱 WebRTC 标准。这一特性确保了“一次开发&#xff0c;多端运行”的便捷性&#xff0c…

【架构思维基础:如何科学定义问题】

架构思维基础&#xff1a;如何科学定义问题 一、问题本质认知 1.1 问题矛盾 根据毛泽东《矛盾论》&#xff0c;问题本质是系统内部要素间既对立又统一的关系。例如&#xff1a; 电商系统矛盾演变&#xff1a; 90年代&#xff1a;商品供给不足 vs 消费需求增长00年代&#x…

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火&#xff0c;虽然网上很多介绍和解读&#xff0c;但听人家的总不如自己去看看原论文。于是花了大概一周的时间&#xff0c;下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…

MySQL(1)基础篇

执行一条 select 语句&#xff0c;期间发生了什么&#xff1f; | 小林coding 目录 1、连接MySQL服务器 2、查询缓存 3、解析SQL语句 4、执行SQL语句 5、MySQL一行记录的存储结构 Server 层负责建立连接、分析和执行 SQL存储引擎层负责数据的存储和提取。支持InnoDB、MyIS…

IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)

IntelliJ IDEA 接入 AI 编程助手&#xff08;Copilot、DeepSeek、GPT-4o Mini&#xff09; &#x1f4ca; 引言 近年来&#xff0c;AI 编程助手已成为开发者的高效工具&#xff0c;它们可以加速代码编写、优化代码结构&#xff0c;并提供智能提示。本文介绍如何在 IntelliJ I…

深度学习之图像分类(一)

前言 图像回归主要是对全连接进行理解 而图像分类任务主要是对卷积的过程进行理解 这一部分会介绍一些基础的概念 卷积的过程&#xff08;包括单通道和多通道&#xff09; 理解一个卷积神经网络工作的过程 以及常见的模型的类别和创新点 图像分类是什么 定义 图像分类是指将输…

LabVIEW利用CANopen的Batch SDO写入

本示例展示了如何通过CANopen协议向设备写入Batch SDO&#xff08;批量服务数据对象&#xff09;。Batch SDO允许用户在一次操作中配置多个参数&#xff0c;适用于设备的批量配置和参数设置。此方法能够简化多个参数的写入过程&#xff0c;提高设备管理效率。 主要步骤&#xf…

WPF9-数据绑定进阶

目录 1. 定义2. 背景3. Binding源3.1. 使用Data Context作为Binding的源3.2. 使用LINQ检索结果作为Binding的源 4. Binding对数据的转换和校验4.1. 需求4.2. 实现步骤4.3. 值转换和校验的好处4.3.1. 数据转换的好处 4.4. 数据校验的好处4.5. 原理4.5.1. 值转换器原理4.5.2. 数据…

力扣 跳跃游戏 II

贪心算法&#xff0c;存下每一步的最远&#xff0c;去达到全局的最小跳跃次数。 题目 从题中要达到最少次数&#xff0c;肯定是每一步尽可能走远一点。但注意j被限制了范围&#xff0c;这种不用想每一步遍历时肯定选最大的num[i]&#xff0c;但要注意&#xff0c;题中是可以到…