1.相关说明
独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现
相关界面包含关系
2.相关界面
3.相关代码
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include "tformdoc.h" #include "tformtable.h"#include <QPainter>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// setCentralWidget(ui->tabWidget);ui->tabWidget->setVisible(false);ui->tabWidget->clear();ui->tabWidget->setTabsClosable(true);}MainWindow::~MainWindow() {delete ui; }void MainWindow::do_changeTabTitle(QString title) {int index = ui->tabWidget->currentIndex();ui->tabWidget->setTabText(index, title); }void MainWindow::on_actionWidgetInsite_triggered() {TFormDoc *formDoc = new TFormDoc(this);formDoc->setAttribute(Qt::WA_DeleteOnClose);int cur = ui->tabWidget->addTab(formDoc, QString::asprintf("Doc %d", ui->tabWidget->count()));ui->tabWidget->setCurrentIndex(cur);ui->tabWidget->setVisible(true);connect(formDoc, &TFormDoc::titleChanged, this, &MainWindow::do_changeTabTitle); } // tab的关闭 void MainWindow::on_tabWidget_tabCloseRequested(int index) {ui->tabWidget->widget(index)->close(); }void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.drawPixmap(0, ui->toolBar->height(),width(), height()-ui->toolBar->height()-ui->statusbar->height(),QPixmap(":/jpg/jpg/shenli.jpg")); }// 独立Widget窗口 void MainWindow::on_actionWidgetAlone_triggered() {TFormDoc *formDoc = new TFormDoc();formDoc->setAttribute(Qt::WA_DeleteOnClose);formDoc->setWindowTitle("基于QWidget的窗口");formDoc->setWindowOpacity(0.8);formDoc->show(); }// 嵌入式MainWindow窗口 void MainWindow::on_actionMainWindowInsite_triggered() {TFormTable *formTable = new TFormTable(this);formTable->setAttribute(Qt::WA_DeleteOnClose);int cur = ui->tabWidget->addTab(formTable, QString::asprintf("Table %d", ui->tabWidget->count()));ui->tabWidget->setCurrentIndex(cur);ui->tabWidget->setVisible(true); } // 独立式MainWindow窗口 void MainWindow::on_actionMainWindowAlone_triggered() {TFormTable *formTable = new TFormTable();formTable->setAttribute(Qt::WA_DeleteOnClose);formTable->setWindowTitle("独立的window");formTable->show(); }
tformdoc.cpp
#include "tformdoc.h" #include "ui_tformdoc.h" #include <QToolBar> #include <QFileDialog> #include <QFontDialog> #include <QVBoxLayout> TFormDoc::TFormDoc(QWidget *parent): QWidget(parent), ui(new Ui::TFormDoc) {ui->setupUi(this);QToolBar *locToolBar = new QToolBar("文档", this);locToolBar->addAction(ui->actionOpenFile);locToolBar->addAction(ui->actionFont);locToolBar->addSeparator();locToolBar->addAction(ui->actionCut);locToolBar->addAction(ui->actionCopy);locToolBar->addAction(ui->actionPatse);locToolBar->addAction(ui->actionRedo);locToolBar->addAction(ui->actionUndo);locToolBar->addSeparator();locToolBar->addAction(ui->actionClose);locToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(locToolBar);layout->addWidget(ui->plainTextEdit);this->setLayout(layout); }TFormDoc::~TFormDoc() {delete ui; }void TFormDoc::on_actionOpenFile_triggered() {QString curPath = QCoreApplication::applicationDirPath();QString aFileName = QFileDialog::getOpenFileName(this, "打开一个文件", curPath, "(*.h *.cpp);;(*.txt);;(*.*)");if(aFileName.isEmpty()){return;}QFile aFile(aFileName);if(aFile.open(QIODevice::ReadOnly | QIODevice::Text)){ui->plainTextEdit->clear();QTextStream aStream(&aFile);while(!aStream.atEnd()){QString str = aStream.readLine();ui->plainTextEdit->appendPlainText(str);}aFile.close();QFileInfo fileInfo(aFileName);QString shortName = fileInfo.fileName();setWindowTitle(shortName);emit titleChanged(shortName);}}void TFormDoc::on_actionFont_triggered() {QFont font = ui->plainTextEdit->font();bool ok;font = QFontDialog::getFont(&ok, font);if(ok){ui->plainTextEdit->setFont(font);} }void TFormDoc::on_actionClose_triggered() {this->close(); }
tformtable.cpp
#include "tformtable.h" #include "ui_TFormTable.h" #include <QStandardItemModel> #include <QItemSelectionModel> #include <QMessageBox> #include <QLabel> #include "tdialogsize.h" #include "tdialogheaders.h" #include "tdialoglocate.h"TFormTable::TFormTable(QWidget *parent): QMainWindow(parent), ui(new Ui::TFormTable) {ui->setupUi(this);dlgHeaders = NULL; // 初始化m_model = new QStandardItemModel(4, 4, this);QStringList header;header << "姓名" << "性别" << "学位" << "部门";m_model->setHorizontalHeaderLabels(header);m_selection = new QItemSelectionModel(m_model);ui->tableView->setModel(m_model);ui->tableView->setSelectionModel(m_selection);setCentralWidget(ui->tableView);labCellPos = new QLabel("当前单元:", this);labCellPos->setMinimumWidth(200);labCellText = new QLabel("单元格内容:", this);labCellText->setMinimumWidth(200);ui->statusbar->addWidget(labCellPos);ui->statusbar->addWidget(labCellText);connect(m_selection, &QItemSelectionModel::currentChanged, this, &TFormTable::do_model_currentChanged); }TFormTable::~TFormTable() {delete ui;}// void TFormTable::on_actionSetRowCol_triggered() // { // TDialogSize *dlgTableSize = new TDialogSize(); // dlgTableSize->setWindowFlag(Qt::MSWindowsFixedSizeDialogHint); // dlgTableSize->setRowColumn(m_model->rowCount(), m_model->columnCount()); // int ret = dlgTableSize->exec(); // if(ret == QDialog::Accepted){ // m_model->setColumnCount(dlgTableSize->columnCount()); // m_model->setRowCount(dlgTableSize->rowCount()); // } // delete dlgTableSize; // }void TFormTable::on_actionSetRowCol_triggered() {TDialogSize dlgTableSize;dlgTableSize.setWindowFlag(Qt::MSWindowsFixedSizeDialogHint);dlgTableSize.setRowColumn(m_model->rowCount(), m_model->columnCount());int ret = dlgTableSize.exec();if(ret == QDialog::Accepted){m_model->setColumnCount(dlgTableSize.columnCount());m_model->setRowCount(dlgTableSize.rowCount());}// delete dlgTableSize; }void TFormTable::on_actionSetHeader_triggered() {if(dlgHeaders == NULL){dlgHeaders = new TDialogHeaders(this);}QStringList strList;for(int i = 0; i < m_model->columnCount(); i++){strList.append(m_model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString());}dlgHeaders->setHeaderList(strList);int ret = dlgHeaders->exec();if(ret == QDialog::Accepted){m_model->setHorizontalHeaderLabels(dlgHeaders->headerList());} }void TFormTable::do_setCellText(int row, int column, QString text) {QModelIndex index = m_model->index(row, column);m_selection->clearSelection();m_selection->setCurrentIndex(index, QItemSelectionModel::Select);m_model->setData(index, text, Qt::DisplayRole); }void TFormTable::on_actionLocateUnit_triggered() {TDialogLocate *dlgLocate = new TDialogLocate(this);dlgLocate->setAttribute(Qt::WA_DeleteOnClose);dlgLocate->setWindowFlag(Qt::WindowStaysOnTopHint);// 初始化对话框dlgLocate->setSpinRange(m_model->rowCount(), m_model->columnCount());QModelIndex curIndex = m_selection->currentIndex();if(curIndex.isValid()){dlgLocate->setSpinValue(curIndex.row(), curIndex.column());}dlgLocate->show();dlgLocate->setModal(false);connect(dlgLocate, &TDialogLocate::changeCellText, this, &TFormTable::do_setCellText);connect(dlgLocate, &TDialogLocate::changeActionEnable, ui->actionLocateUnit, &QAction::setEnabled);connect(this, &TFormTable::cellIndexChanged, dlgLocate, &TDialogLocate::setSpinValue);}void TFormTable::on_tableView_clicked(const QModelIndex &index) {emit cellIndexChanged(index.row(), index.column()); }void TFormTable::do_model_currentChanged(const QModelIndex ¤t, const QModelIndex &previous) {Q_UNUSED(previous);if(current.isValid()){labCellPos->setText(QString::asprintf("当前单元格:%d行,%d列",current.row(), current.column()));QStandardItem *aItem = m_model->itemFromIndex(current);labCellText->setText("单元格内容:" + aItem->text());} }
tdialogheaders.cpp
#include "tdialogheaders.h" #include "ui_tdialogheaders.h" #include <QStringListModel>TDialogHeaders::TDialogHeaders(QWidget *parent): QDialog(parent), ui(new Ui::TDialogHeaders) {ui->setupUi(this);m_model = new QStringListModel(this);ui->listView->setModel(m_model); }TDialogHeaders::~TDialogHeaders() {delete ui; }void TDialogHeaders::setHeaderList(QStringList &headers) {m_model->setStringList(headers); }QStringList TDialogHeaders::headerList() {return m_model->stringList(); }
tdialoglocate.cpp
#include "tdialoglocate.h" #include "ui_tdialoglocate.h" #include <QCloseEvent> #include <QShowEvent>TDialogLocate::TDialogLocate(QWidget *parent): QDialog(parent), ui(new Ui::TDialogLocate) {ui->setupUi(this); }TDialogLocate::~TDialogLocate() {delete ui; }void TDialogLocate::setSpinRange(int rowCount, int colCount) {ui->spinBoxRow->setMaximum(rowCount-1);ui->spinBoxCol->setMaximum(colCount-1); }void TDialogLocate::setSpinValue(int rowNo, int colNo) {ui->spinBoxRow->setValue(rowNo);ui->spinBoxCol->setValue(colNo); }// 设定文字 void TDialogLocate::on_btnSetText_clicked() {QString text = ui->lineEdit->text();int row = ui->spinBoxRow->value();int col = ui->spinBoxCol->value();if(ui->chkIncRow->isChecked()){ui->spinBoxRow->setValue(ui->spinBoxRow->value()+1);}if(ui->chkIncCol->isChecked()){ui->spinBoxCol->setValue(ui->spinBoxCol->value()+1);}emit changeCellText(row, col, text); }void TDialogLocate::closeEvent(QCloseEvent *event) {event->accept();emit changeActionEnable(true); }void TDialogLocate::showEvent(QShowEvent *event) {event->accept();emit changeActionEnable(false); }
tdialogsize.cpp
#include "tdialogsize.h" #include "ui_tdialogsize.h" #include <QMessageBox>TDialogSize::TDialogSize(QWidget *parent): QDialog(parent), ui(new Ui::TDialogSize) {ui->setupUi(this); }TDialogSize::~TDialogSize() {delete ui;QMessageBox::information(this, "提示", "TDialogSize释放资源"); }void TDialogSize::setRowColumn(int row, int column) {ui->spinBoxRow->setValue(row);ui->spinBoxCol->setValue(column); }int TDialogSize::rowCount() {return ui->spinBoxRow->value(); }int TDialogSize::columnCount() {return ui->spinBoxCol->value(); }