界面
代碼
qwmainwindow.h
#ifndef QWMAINWINDOW_H
#define QWMAINWINDOW_H
#include <QMainWindow>
#include "qformdoc.h"
#include "qformtable.h"
namespace Ui {
class QWMainWindow;
}
class QWMainWindow : public QMainWindow
{
Q_OBJECT
private:
//重載函數,可在裡面加入圖檔
void paintEvent(QPaintEvent *event);
public:
explicit QWMainWindow(QWidget *parent = 0);
~QWMainWindow();
private slots:
void on_tabWidget_tabCloseRequested(int index);
void on_actWidgetInsite_triggered();
void on_actWindowInsite_triggered();
void on_actWindow_triggered();
void on_actWidget_triggered();
void on_tabWidget_currentChanged(int index);
private:
Ui::QWMainWindow *ui;
};
#endif // QWMAINWINDOW_H
qwmainwindow.cpp
#include "qwmainwindow.h"
#include "ui_qwmainwindow.h"
#include <QPainter>
#include <QFileDialog>
#include "qwmisc.h"
void QWMainWindow::paintEvent(QPaintEvent *event)
{ //繪制視窗背景圖檔
Q_UNUSED(event);
QPainter painter(this);
// x, y, w.h
//0,工具欄下面第一行,this(mainwindow)的寬度,戶界面減去上下工具欄和狀态欄的高度
painter.drawPixmap(0,ui->mainToolBar->height(),this->width(),
this->height()-ui->mainToolBar->height()-ui->statusBar->height(),
QPixmap(":/images/images/back2.jpg"));
}
QWMainWindow::QWMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QWMainWindow)
{
ui->setupUi(this);
ui->tabWidget->setVisible(false); //希望剛啟動的時候圖檔顯示出來,是以可視化設為false
ui->tabWidget->clear();//清除所有頁面
ui->tabWidget->tabsClosable(); //Page有關閉按鈕,可被關閉
this->setCentralWidget(ui->tabWidget);
// this->setWindowState(Qt::WindowFullScreen); //視窗最大化顯示
this->setWindowState(Qt::WindowMaximized); //視窗最大化顯示
// this->setWindowState(Qt::WindowMinimized); //視窗最大化顯示
this->setAutoFillBackground(true);
// this->setAttribute(Qt::WA_DeleteOnClose); //關閉時自動删除
// Qt::WindowFlags flags=this->windowFlags();
// this->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //設定對話框固定大小
}
QWMainWindow::~QWMainWindow()
{
delete ui;
}
void QWMainWindow::on_tabWidget_tabCloseRequested(int index)
{//關閉Tab
if (index<0)
return;
QWidget* aForm=ui->tabWidget->widget(index);
aForm->close();
}
void QWMainWindow::on_actWidgetInsite_triggered()
{ //建立QFormDoc窗體,并在tabWidget中顯示
QFormDoc *formDoc = new QFormDoc(this); //不指定父視窗,單獨用show()方法顯示
formDoc->setAttribute(Qt::WA_DeleteOnClose); //關閉時自動删除
// formDoc->setWindowFlag(Qt::Widget,true);
// formDoc->setWindowFlag(Qt::CustomizeWindowHint,true);
// formDoc->setWindowFlag(Qt::WindowMinMaxButtonsHint,false);
// formDoc->setWindowState(Qt::WindowMaximized);
// formDoc->setWindowOpacity(0.5);
// formDoc->setWindowModality(Qt::WindowModal);
// formDoc->show(); //在單獨的視窗中顯示
// formDoc->setWindowTitle("基于QWidget的視窗,無父視窗,關閉時删除");
//傳回的是目前第幾個
int cur=ui->tabWidget->addTab(formDoc,
QString::asprintf("Doc %d",ui->tabWidget->count()));//參數2是标題
ui->tabWidget->setCurrentIndex(cur);
ui->tabWidget->setVisible(true);
}
void QWMainWindow::on_actWindowInsite_triggered()
{
QFormTable *formTable = new QFormTable(this);
formTable->setAttribute(Qt::WA_DeleteOnClose); //關閉時自動删除
// aTable->setWindowTitle("基于QWidget的視窗,無父視窗,關閉時删除");
int cur=ui->tabWidget->addTab(formTable,
QString::asprintf("Table %d",ui->tabWidget->count()));
ui->tabWidget->setCurrentIndex(cur);
ui->tabWidget->setVisible(true);
}
void QWMainWindow::on_actWindow_triggered()
{
QFormTable* formTable = new QFormTable(this);
// formChart = new QFormTable(); //無父窗體,在windows工作列上有顯示
formTable->setAttribute(Qt::WA_DeleteOnClose); //對話框關閉時自動删除對話框對象,用于不需要讀取傳回值的對話框
formTable->setWindowTitle("基于QMainWindow的視窗,指定父視窗,關閉時删除");
// formChart->setWindowTitle("多執行個體視窗,指定父視窗");
formTable->show();
}
void QWMainWindow::on_actWidget_triggered()
{
QFormDoc *formDoc = new QFormDoc(); //不指定父視窗,用show()顯示
formDoc->setAttribute(Qt::WA_DeleteOnClose); //關閉時自動删除
formDoc->setWindowTitle("基于QWidget的窗體,無父視窗,關閉時删除");
formDoc->setWindowFlag(Qt::Window,true);
// formDoc->setWindowFlag(Qt::CustomizeWindowHint,true);
// formDoc->setWindowFlag(Qt::WindowMinMaxButtonsHint,true);
// formDoc->setWindowFlag(Qt::WindowCloseButtonHint,true);
// formDoc->setWindowFlag(Qt::WindowStaysOnTopHint,true);
// formDoc->setWindowState(Qt::WindowMaximized);
formDoc->setWindowOpacity(0.9);
// formDoc->setWindowModality(Qt::WindowModal);
formDoc->show(); //在單獨的視窗中顯示
}
void QWMainWindow::on_tabWidget_currentChanged(int index)
{
Q_UNUSED(index);
bool en=ui->tabWidget->count()>0; //再無頁面時,actions禁用
ui->tabWidget->setVisible(en);
}
qformdoc.h
#ifndef QFORMDOC_H
#define QFORMDOC_H
#include <QWidget>
namespace Ui {
class QFormDoc;
}
class QFormDoc : public QWidget
{
Q_OBJECT
private:
QString mCurrentFile; //目前檔案
public:
explicit QFormDoc(QWidget *parent = 0);
~QFormDoc();
void loadFromFile(QString& aFileName);
private slots:
void on_actOpen_triggered();
void on_actFont_triggered();
private:
Ui::QFormDoc *ui;
};
#endif // QFORMDOC_H
qformdoc.cpp
#include "qformdoc.h"
#include "ui_qformdoc.h"
#include <QToolBar>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QFontDialog>
#include <QFileInfo>
#include <QMessageBox>
#include <qwmainwindow.h>
QFormDoc::QFormDoc(QWidget *parent) :
QWidget(parent),
ui(new Ui::QFormDoc)
{
ui->setupUi(this);
//使用UI設計的Actions設計工具欄
QToolBar* locToolBar = new QToolBar(tr("文檔"),this); //建立工具欄
locToolBar->addAction(ui->actOpen);
locToolBar->addAction(ui->actFont);
locToolBar->addSeparator();
locToolBar->addAction(ui->actCut);
locToolBar->addAction(ui->actCopy);
locToolBar->addAction(ui->actPaste);
locToolBar->addAction(ui->actUndo);
locToolBar->addAction(ui->actRedo);
locToolBar->addSeparator();
locToolBar->addAction(ui->actClose);
locToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
// locToolBar->setAutoFillBackground(true);
QVBoxLayout *Layout = new QVBoxLayout();
Layout->addWidget(locToolBar); //設定工具欄和編輯器上下布局
Layout->addWidget(ui->plainTextEdit);
Layout->setContentsMargins(2,2,2,2); //減小邊框的寬度
Layout->setSpacing(2);
this->setLayout(Layout); //設定布局
// this->setAutoFillBackground(true); //避免工具欄顯示背景圖檔
}
QFormDoc::~QFormDoc()
{
// QMessageBox::information(this, "消息", "QFormDoc對象被删除和釋放");
delete ui;
}
void QFormDoc::loadFromFile(QString &aFileName)
{
QString str;
QFile aFile(aFileName); //以檔案方式讀出
if (aFile.open(QIODevice::ReadOnly | QIODevice::Text)) //以隻讀文本方式打開檔案
{
QTextStream aStream(&aFile); //用文本流讀取檔案
ui->plainTextEdit->clear();//清空
while (!aStream.atEnd())
{
str=aStream.readLine();//讀取檔案的一行
ui->plainTextEdit->appendPlainText(str); //添加到文本框顯示
}
aFile.close();//關閉檔案
mCurrentFile=aFileName;
QFileInfo fileInfo(aFileName);
QString shorName=fileInfo.fileName();
this->setWindowTitle(shorName);
}
}
void QFormDoc::on_actOpen_triggered()
{
// curPath=QCoreApplication::applicationDirPath(); //擷取應用程式的路徑
QString curPath=QDir::currentPath();
//調用打開檔案對話框打開一個檔案
QString aFileName=QFileDialog::getOpenFileName(this,tr("打開一個檔案"),curPath,
"C程式檔案檔案(*.h *cpp);;文本檔案(*.txt);;所有檔案(*.*)");
if (aFileName.isEmpty())
return; //如果未選擇檔案,退出
loadFromFile(aFileName);
}
void QFormDoc::on_actFont_triggered()
{
QFont font;
font=ui->plainTextEdit->font();
bool ok;
font=QFontDialog::getFont(&ok,font);
ui->plainTextEdit->setFont(font);
}
qformtable.h
#ifndef QFORMTABLE_H
#define QFORMTABLE_H
#include <QMainWindow>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include "qwdialogheaders.h"
#include "qwdialogsize.h"
namespace Ui {
class QFormTable;
}
class QFormTable : public QMainWindow
{
Q_OBJECT
private:
QWDialogHeaders *dlgSetHeaders=NULL;//設定表頭文字對話框, 一次建立,exec()重複調用
QStandardItemModel *theModel;//資料模型
QItemSelectionModel *theSelection;//Item選擇模型
public:
explicit QFormTable(QWidget *parent = 0);
~QFormTable();
private slots:
void on_actSize_triggered();
void on_actSetHeader_triggered();
private:
Ui::QFormTable *ui;
};
#endif // QFORMTABLE_H
qformtable.cpp
#include "qformtable.h"
#include "ui_qformtable.h"
#include <QMessageBox>
QFormTable::QFormTable(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QFormTable)
{
ui->setupUi(this);
theModel = new QStandardItemModel(12,6,this); //資料模型
theSelection = new QItemSelectionModel(theModel);//Item選擇模型
//為tableView設定資料模型
ui->tableView->setModel(theModel); //設定資料模型
ui->tableView->setSelectionModel(theSelection);//設定選擇模型
// QMessageBox::information(this, "消息", "表格視窗被建立");
}
QFormTable::~QFormTable()
{
// QMessageBox::information(this, "消息", "FormTable視窗被删除和釋放");
delete ui;
}
void QFormTable::on_actSize_triggered()
{
QWDialogSize *dlgTableSize=new QWDialogSize(this); //建立對話框
Qt::WindowFlags flags=dlgTableSize->windowFlags();
dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //設定對話框固定大小
dlgTableSize->setRowColumn(theModel->rowCount(),theModel->columnCount()); //對話框資料初始化
int ret=dlgTableSize->exec();// 以模态方式顯示對話框,使用者關閉對話框時傳回 DialogCode值
if (ret==QDialog::Accepted) //OK鍵被按下,對話框關閉,若設定了setAttribute(Qt::WA_DeleteOnClose),對話框被釋放,無法獲得傳回值
{ //OK鍵被按下,擷取對話框上的輸入,設定行數和列數
int cols=dlgTableSize->columnCount();
theModel->setColumnCount(cols);
int rows=dlgTableSize->rowCount();
theModel->setRowCount(rows);
}
delete dlgTableSize; //删除對話框
}
void QFormTable::on_actSetHeader_triggered()
{
if (dlgSetHeaders==NULL) //如果對象沒有被建立過,就建立對象
dlgSetHeaders = new QWDialogHeaders(this);
if (dlgSetHeaders->headerList().count()!=theModel->columnCount())
{
QStringList strList;
for (int i=0;i<theModel->columnCount();i++)//擷取現有的表頭标題
strList.append(theModel->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString());
dlgSetHeaders->setHeaderList(strList);//用于對話框初始化顯示
}
int ret=dlgSetHeaders->exec();// 以模态方式顯示對話框
if (ret==QDialog::Accepted) //OK鍵被按下
{
QStringList strList=dlgSetHeaders->headerList();//擷取對話框上修改後的StringList
theModel->setHorizontalHeaderLabels(strList);// 設定模型的表頭标題
}
}
qwdialogheaders.h
#ifndef QWDIALOGHEADERS_H
#define QWDIALOGHEADERS_H
#include <QDialog>
#include <QStringListModel>
namespace Ui {
class QWDialogHeaders;
}
class QWDialogHeaders : public QDialog
{
Q_OBJECT
private:
QStringListModel *model;
public:
explicit QWDialogHeaders(QWidget *parent = 0);
~QWDialogHeaders();
void setHeaderList(QStringList& headers);
QStringList headerList();
private:
Ui::QWDialogHeaders *ui;
};
#endif // QWDIALOGHEADERS_H
qwdialogheaders.cpp
#include "qwdialogheaders.h"
#include "ui_qwdialogheaders.h"
#include <QMessageBox>
QWDialogHeaders::QWDialogHeaders(QWidget *parent) :
QDialog(parent),
ui(new Ui::QWDialogHeaders)
{
ui->setupUi(this);
model= new QStringListModel;
ui->listView->setModel(model);
}
QWDialogHeaders::~QWDialogHeaders()
{
// QMessageBox::information(this, "消息", "DialogHeaders對話框被删除和釋放");
delete ui;
}
void QWDialogHeaders::setHeaderList(QStringList &headers)
{
model->setStringList(headers);
}
QStringList QWDialogHeaders::headerList()
{
return model->stringList();
}
#ifndef QWDIALOGSIZE_H
#define QWDIALOGSIZE_H
#include <QDialog>
namespace Ui {
class QWDialogSize;
}
class QWDialogSize : public QDialog
{
Q_OBJECT
public:
explicit QWDialogSize(QWidget *parent = 0);
~QWDialogSize();
int rowCount();//擷取對話框輸入的行數
int columnCount();//擷取對話框輸入的列數
void setRowColumn(int row, int column); //初始對話框上兩個SpinBox的值
private slots:
private:
Ui::QWDialogSize *ui;
};
#endif // QWDIALOGSIZE_H
#include "qwdialogsize.h"
#include "ui_qwdialogsize.h"
#include <QMessageBox>
QWDialogSize::QWDialogSize(QWidget *parent) :
QDialog(parent),
ui(new Ui::QWDialogSize)
{
ui->setupUi(this);
}
QWDialogSize::~QWDialogSize()
{
// QMessageBox::information(this,"提示","DialogSize對話框被删除");
delete ui;
}
int QWDialogSize::rowCount()
{ //用于主視窗調用獲得行數的輸入值
return ui->spinBoxRow->value();
}
int QWDialogSize::columnCount()
{//用于主視窗調用獲得列數的輸入值
return ui->spinBoxColumn->value();
}
void QWDialogSize::setRowColumn(int row, int column)
{ //初始化資料顯示
ui->spinBoxRow->setValue(row);
ui->spinBoxColumn->setValue(column);
}