1.相关说明
独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现
相关界面包含关系
2.相关界面
3.相关代码
mainwindow.cpp
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
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
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
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
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
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(); }