按照楼上的说法,我改写了代码,但是还是没法运行,编译是通过的,只是运行时出现异常关闭。
具体代码如下: 红色标志的是文件间运行的主要代码,蓝色是我贴出的四个涉及到得文件
//mainwindow.cpp
#include <QtGui/QAction>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QKeySequence>
#include <QtGui/QToolBar>
#include <QtGui>
#include <QMessageBox>
#include <QApplication>
#include <QPicture>
#include <QGroupBox>
#include <QRadioButton>
#include <QStandardItemModel>
#include <QSqlQuery>
#include "mainwindow.h"
#include "linkconfig/config.h"
#include "open/open.h"
#include "borderlayout.h"
#include "global.h"
MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
{
    //textEdit=new QTextEdit;
    //this->setCentralWidget(textEdit);
    p = (MainWindow*) parent;
    openAction = new QAction(tr("打开"), this);
    openAction->setShortcut(QKeySequence::Open);
    openAction->setStatusTip(tr("Open a file."));
    openAction->setIcon(QIcon(":/images/qt-logo.png"));
    connect(openAction, SIGNAL(triggered()), this, SLOT(openwindows()));
    closeAction=new QAction(tr("关闭窗口"),this);
    closeAction->setShortcut(QKeySequence::Close);
    //closeAction->setShortcut(QApplication::translate("MainWindow", "Ctrl+X", 0, QApplication::UnicodeUTF8));
    configAction=new QAction(tr("连接配置"),this);
    connect(configAction,SIGNAL(triggered()),this,SLOT(link()));
    exitAction=new QAction(tr("退出"),this);
    exitAction->setShortcut(QKeySequence::Quit);
    toolsAction=new QAction(tr("工具栏"),this);
    runrptAction=new QAction(tr("显示运行记录"),this);
    refreshAction=new QAction(tr("刷新"),this);
    refreshAction->setShortcut(QKeySequence::Refresh);
    aboutAction=new QAction(tr("关于"),this);
    QMenu *file = menuBar()->addMenu(tr("文件"));
    file->addAction(openAction);
    file->addAction(closeAction);
    file->addSeparator();
    file->addAction(configAction);
    file->addSeparator();
    file->addAction(exitAction);
    QMenu *view = menuBar()->addMenu(tr("视图"));
    view->addAction(toolsAction);
    view->addAction(runrptAction);
    view->addSeparator();
    view->addAction(refreshAction);
    QMenu *find = menuBar()->addMenu(tr("查询"));
    tools = menuBar()->addMenu(tr("工具"));
    QMenu *window= menuBar()->addMenu(tr("窗口"));
    QMenu *help = menuBar()->addMenu(tr("帮助"));
    help->addAction(aboutAction);
    moveAction=new QAction(tr("移动"),this);
    moveAction->setIcon(QIcon(":/images/smiley.png"));
    zoomMenu=new QMenu;
    zoomMenu->setIcon(QIcon(":/images/services.png"));
    zoomMenu->setTitle(tr("缩放"));
    QActionGroup *actionGroup=new QActionGroup(this);
    QAction *zoom25=new QAction(tr("25%"),this);
    zoom25->setCheckable(true);//设置前面可以勾选
    zoom25->setActionGroup(actionGroup);
    zoomMenu->addAction(zoom25);
    QAction *zoom50=new QAction(tr("50%"),this);
    zoom50->setCheckable(true);
    zoom50->setActionGroup(actionGroup);
    zoomMenu->addAction(zoom50);
    QAction *zoom100=new QAction(tr("100%"),this);
    zoom100->setActionGroup(actionGroup);
    zoom100->setCheckable(true);
    zoomMenu->addAction(zoom100);
    QAction *zoom150=new QAction(tr("150%"),this);
    zoom150->setActionGroup(actionGroup);
    zoom150->setCheckable(true);
    zoomMenu->addAction(zoom150);
    zoomMenu->addAction(QIcon(":/images/zoomin.png"),tr("200%"));
    zoomMenu->addAction(QIcon(":/images/services.png"),tr("400%"));
    QToolBar *toolBar = addToolBar(tr("工具栏"));//右击可以关闭打开该工具栏
    toolBar->addAction(openAction);
    toolBar->addAction(moveAction);
    toolBar->addAction(zoomMenu->menuAction());
    aa=new QWidget;
    this->setCentralWidget(aa);
    label=new QLabel(tr("I am hhahahah"),aa);}
MainWindow::~MainWindow()
{
}
void MainWindow::link()
{
    config *dialog=new config;
    dialog->setModal(true);//设置对话框模式
    dialog->setWindowFlags(Qt::WindowTitleHint);//将右上角的?按钮去掉,只有关闭按钮
    dialog->show();
}
void MainWindow::openwindows()
{
    dialog=new open;    dialog->setModal(true);//设置对话框模式
    dialog->setWindowFlags(Qt::WindowTitleHint);//将右上角的?按钮去掉,只有关闭按钮
    dialog->show();
}
//创建image、runreport布局
void MainWindow::createDockWindows()
{
    dock = new QDockWidget(tr("showImage"), this);
    dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
    //textEdit=new QTextEdit;
    //dock->setWidget(textEdit);
    addDockWidget(Qt::TopDockWidgetArea, dock);
    tools->addAction(dock->toggleViewAction());//将showImage页面加到菜单工具下
    dock = new QDockWidget(tr("runReport"), this);
    tabWidget = new QTabWidget;    
    tabWidget->addTab(new ATab,tr("动作信息"));
    tabWidget->addTab(new BTab,tr("程序运行信息"));
    dock->setWidget(tabWidget);
    addDockWidget(Qt::BottomDockWidgetArea, dock);
    tools->addAction(dock->toggleViewAction());
    //connect(customerList, SIGNAL(currentTextChanged(QString)),
            //this, SLOT(insertCustomer(QString)));
    //connect(paragraphsList, SIGNAL(currentTextChanged(QString)),
           // this, SLOT(addParagraph(QString)));
}
ATab::ATab(QWidget *parent):QWidget(parent)
{
    BorderLayout *layout = new BorderLayout; // 手动编写的borderlayout类
    this->setLayout(layout);
    QStringList heardData=(QStringList()<<tr("序号")<<tr("保护名称")<<tr("动作时间")<<tr("内容")<<tr("动作相别")<<tr("是否确认")<<tr("类型"));
    /*QStandardItemModel *model=new QStandardItemModel;
    model->setHorizontalHeaderLabels(heardData);
    table=new QTableView(this);     
    table->setGeometry(0,0,this->size().width(),this->height()/2);
    table->setModel(model);
    layout->addWidget(table, BorderLayout::Center);*/
    tableWidget=new QTableWidget(this);
    tableWidget->setColumnCount(heardData.length());
    //tableWidget->setRowCount(5);
    tableWidget->setHorizontalHeaderLabels(heardData);
    tableWidget->insertRow(0);
    tableWidget->setItem(0,0,new QTableWidgetItem(QString("aaaaaa")));
    layout->addWidget(tableWidget, BorderLayout::Center);
}
BTab::BTab(QWidget *parent):QWidget(parent)
{
QLabel *bLabel=new QLabel(tr("I am BTab"),this);
}
//mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include <QComboBox>
#include <QLabel>
#include <QGroupBox>
class QAction;
class QTextEdit;
class QTabWidget;
class QTableView;
class QTableWidget;
class open;class MainWindow : public QMainWindow
{
        Q_OBJECT
public:
        MainWindow(QWidget *parent=0);
        ~MainWindow();
        void createDockWindows();
        QLabel* label;private slots:
    void openwindows();
    void link();
private:
QWidget* aa;
        QAction *openAction;
        QAction *closeAction;
        QAction *configAction;
        QAction *exitAction;
        QAction *toolsAction;
        QAction *runrptAction;
        QAction *refreshAction;
        QAction *aboutAction;
        QAction *moveAction;
        QMenu *zoomMenu;
        QMenu *tools;
        QGroupBox *typeGroup;
        QTextEdit *textEdit;
        QLabel *imageLabel;
        QTabWidget *tabWidget;
        QDockWidget *dock;
        MainWindow* p;
protected:
        open* dialog;
 };
class ATab:public QWidget
{
Q_OBJECT
public:
    ATab(QWidget *parent=0);
private:
        QTableView *table;
        QTableWidget *tableWidget;
};
class BTab:public QWidget
{
Q_OBJECT
public:
    BTab(QWidget *parent=0);
private:
        QTableView *table;
};
#endif // MAINWINDOW_H
//open.cpp#include "open.h"
#include "ui_open.h"
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QDomDocument>
#include <QFile>
#include "global.h"
#include <QSqlQuery>
#include "mainwindow.h"
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QDockWidget>
open::open(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::open)
{
    ui->setupUi(this);
    this->initlist();
    connect(ui->okButton,SIGNAL(clicked()), this, SLOT(createConnection()));
    connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(close()));
}
open::~open()
{
    delete ui;
}
void open::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
void open::initlist(){
    QDomDocument doc;
    QFile file(":/linkconfig/ifisconfig.xml");
    file.open(QIODevice::ReadOnly);
    doc.setContent(file.readAll());
    file.close();
    QDomNode root = doc.documentElement();
    if (!root.isNull())
    {
        QDomNodeList nodelist = root.childNodes();
        for(int i=0;i<nodelist.count();i++)
        {
            QDomNode node=nodelist.at(i);
            QDomAttr name=node.toElement().attributeNode("name");
            /*QDomNodeList leaflist = node.childNodes();
            ip=leaflist.at(0).toElement().text();
            database=leaflist.at(1).toElement().text();
            port=leaflist.at(2).toElement().text();
            qWarning((const char*)ip.toLatin1().data());//QString转化为const char*类型
            */
            ui->listWidget->addItem(QString(name.value()));
        }
    }
}
bool open::createConnection(){
    if(ui->listWidget->selectedItems().at(0)!=NULL){
        QString selecteditem=ui->listWidget->selectedItems().at(0)->text();
        searchXml(&selecteditem);
    }
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(ip);
    db.setPort(port.toInt());
    db.setDatabaseName(database);
    db.setUserName("test");
    db.setPassword("test");
    ok  = db.open(); // 尝试连接数据库
    if(ok) //连接数据库成功
    {
        this->close();
        ownmain->label->setText(tr("hahahahahah"));       
        }
        else // 打开数据库失败
    {
        QString message="cannot open database.Reason:";
        message.append(db.lastError().databaseText());
        QMessageBox::critical(NULL,"open database",message,QMessageBox::Yes,QMessageBox::Yes);
    }
    return ok;
}
//获得所选中的ip、port、database
void open::searchXml(QString *selecteditem){
    QDomDocument doc;
    QFile file(":/linkconfig/ifisconfig.xml");
    file.open(QIODevice::ReadOnly);
    doc.setContent(file.readAll());
    file.close();
    QDomNode root = doc.documentElement();
    if (!root.isNull())
    {
        QDomNodeList nodelist = root.childNodes();
        for(int i=0;i<nodelist.count();i++)
        {
            QDomNode node=nodelist.at(i);
            QDomAttr name=node.toElement().attributeNode("name");
            if(name.value()==selecteditem){
                QDomNodeList leaflist = node.childNodes();
                ip=leaflist.at(0).toElement().text();
                database=leaflist.at(1).toElement().text();
                port=leaflist.at(2).toElement().text();
            }
        }
    }
}
//open.h
#ifndef OPEN_H
#define OPEN_H
#include <QDialog>
namespace Ui {
    class open;
}
class MainWindow;
class open : public QDialog {
    Q_OBJECT
public:
    open(QWidget* parent=0);
    ~open();
private slots:
    bool createConnection();
protected:
    void changeEvent(QEvent *e);
    void initlist();
    void searchXml(QString *item);
private:
    Ui::open *ui;
    MainWindow* ownmain;};
#endif // OPEN_H