• 6768阅读
  • 5回复

不同类间的控件共用 [复制链接]

上一主题 下一主题
离线jiang_198586
 

只看楼主 倒序阅读 楼主  发表于: 2010-03-07
打开的对话框,点击确定按钮后,怎么在该类下对主窗体的控件进行操作?
离线seekawayout

只看该作者 1楼 发表于: 2010-03-08
你是说在对话框中处理主窗口的控件????
//在mainwin.h
class dlg;
class mainWin:QMainWindows
{
...
protected:
  dlg* theDlg;
...
};

// mainwin.cpp
#include "dlg.h"
mainWin::mainWin (...):...
{
  theDlg = new dlg;
}
// 在dlg.h

class mainWin;

class dlg:QDialog {
...
private:
  mainWin* ownWin;
};

//dlg.cpp
#include "mainwin.h"
void
dlg::function {
  ownWin->..widget->...
}

在窗口类.h文件声明对话框类,并在窗口类声明对话框的指针对象(必须是指针,如果是对象的话,编译提示对话框为未实现的类,编译不过去)。在窗口类的.cpp中#include "dlg.h"(不要在mainwin.h文件中包含),并new dlg;
然后在dlg.cpp中#include "mainwin.h"

如果我没理解错的话这样就可以了。

另,可以加入irc.freenode.net/8001的IRC中#qtcn中参与在线讨论
[ 此帖被seekawayout在2010-03-08 09:04重新编辑 ]
离线jiang_198586

只看该作者 2楼 发表于: 2010-03-09
怎么加入irc.freenode.net/8001的IRC中#qtcn中参与在线讨论啊?
离线jiang_198586

只看该作者 3楼 发表于: 2010-03-09
按照楼上的说法,我改写了代码,但是还是没法运行,编译是通过的,只是运行时出现异常关闭。
具体代码如下: 红色标志的是文件间运行的主要代码,蓝色是我贴出的四个涉及到得文件
//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
离线hover_sky

只看该作者 4楼 发表于: 2010-03-09
子对话框向主对话框发信号,主窗体受到信号,向控件发信号,然后控件执行对应的slot
离线jiang_198586

只看该作者 5楼 发表于: 2010-03-09
那应该怎么写啊?你看懂我上面贴出来的程序了吧?
快速回复
限100 字节
 
上一个 下一个