QT挂起我的工具栏及其按钮

时间:2011-07-10 10:48:57

标签: qt qwidget

我创建了两个类:

  1. QWidget作为父母
  2. Q_OBJECT个宏
  3. 执行一些操作,创建菜单栏和工具栏,并将操作连接到它们
  4. 然后我创建了主程序文件,创建了QMainWindow,并通过qmainwnd指针初始化了我的两个类。

    我得到的东西 - 菜单有效,第二个工具栏有效,但第一个工具栏(由第1类创建)不响应鼠标点击。

    发生了什么事?为什么我甚至无法移动第一个工具栏或单击其按钮?

    这是一个示例:

    main.cpp

    #include <QApplication>
    #include <QMainWindow>
    
    #include "CModDocument.h"
    #include "CModEditor.h"
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QMainWindow wnd;
    
        // init CA
        CModDocument a(&wnd);
    
        // init CB
        CModEditor b(&wnd);
    
        wnd.show();
    
        return app.exec();
    }
    

    CModDocument.h

    #ifndef CMODDOCUMENT_H
    #define CMODDOCUMENT_H
    
    #include <QWidget>
    
    QT_BEGIN_NAMESPACE
    class QAction;
    class QToolBar;
    class QMainWindow;
    QT_END_NAMESPACE
    
    class CModDocument: public QWidget
    {
    
        Q_OBJECT
    
    public:
        CModDocument(QWidget *parent = 0);
    
        QMainWindow *getMainWnd();
    
    public slots:
        void newFile();
        void open();
        bool save();
        bool saveAs();
    
    private:
        void createActions();
        void createToolBars();
        void interCom();
    
        QMainWindow *mainWnd;
    
        QToolBar *fileToolBar;
        QAction *newAct;
        QAction *openAct;
        QAction *saveAct;
        QAction *saveAsAct;
    };
    
    #endif // CMODDOCUMENT_H
    

    CModDocument.cpp

    #include <QtGui>
    #include <QDebug>
    #include "CModDocument.h"
    
    CModDocument::CModDocument( QWidget *parent )
    : QWidget( parent )
    , mainWnd( (QMainWindow*)parent )
    {
        createActions();
        createToolBars();
        interCom();
    
        mainWnd->statusBar()->showMessage(tr("Ready"));
    }
    
    void CModDocument::newFile()
    {
        qDebug() << "newFile";
    }
    
    void CModDocument::open()
    {
        qDebug() << "open";
    }
    
    bool CModDocument::save()
    {
        qDebug() << "save";
        bool retVal;
        return retVal;
    }
    
    bool CModDocument::saveAs()
    {
        qDebug() << "saveAs";
        bool retVal;
        return retVal;
    }
    
    
    void CModDocument::createActions()
    {
        newAct = new QAction(tr("&New"), this);
        newAct->setShortcuts(QKeySequence::New);
        newAct->setStatusTip(tr("Create a new file"));
    
        openAct = new QAction(tr("&Open..."), this);
        openAct->setShortcuts(QKeySequence::Open);
        openAct->setStatusTip(tr("Open an existing file"));
    
        saveAct = new QAction(tr("&Save"), this);
        saveAct->setShortcuts(QKeySequence::Save);
        saveAct->setStatusTip(tr("Save the document to disk"));
    
        saveAsAct = new QAction(tr("Save &As..."), this);
        saveAsAct->setShortcuts(QKeySequence::SaveAs);
        saveAsAct->setStatusTip(tr("Save the document under a new name"));
    }
    
    void CModDocument::createToolBars()
    {
        fileToolBar = mainWnd->addToolBar(tr("File"));
        fileToolBar->addAction(newAct);
        fileToolBar->addAction(openAct);
        fileToolBar->addAction(saveAct);
    }
    
    void CModDocument::interCom()
    {
        connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
        connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
        connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));
        connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));
    }
    

    CModEditor.h

    #ifndef CMODEDITOR_H
    #define CMODEDITOR_H
    
    #include <QWidget>
    // #include "CModEdiWidget.h"
    
    QT_BEGIN_NAMESPACE
    class QMainWindow;
    class QAction;
    class QMenu;
    class QMenuBar;
    class QToolBar;
    QT_END_NAMESPACE
    
    class CModEditor : public QWidget
    {
        Q_OBJECT
    
    public:
        CModEditor(QWidget *parent = 0);
    
    public slots:
        void cut();
    
    private:
        void createActions();
        void createToolBars();
        void interCom();
    
        QAction *cutAct;
        QToolBar *editToolBar;
    
        // parent
        QMainWindow *mainWnd;
    };
    
    #endif
    

    CModEditor.cpp

    #include <QtGui>
    #include <QDebug>
    
    #include "CModEditor.h"
    
    CModEditor::CModEditor(QWidget *parent)
    : QWidget(parent)
    , mainWnd( (QMainWindow*)parent )
    {
        createActions();
        createToolBars();
        interCom();
    }
    
    void CModEditor::cut()
    
    {
        qDebug() << "cut";
    }
    void CModEditor::createActions()
    {
        cutAct = new QAction(tr("Cu&t"), this);
        cutAct->setShortcuts(QKeySequence::Cut);
        cutAct->setStatusTip(tr("Cut the current selection's contents to the clipboard"));
    }
    
    void CModEditor::createToolBars()
    {
        editToolBar = mainWnd->addToolBar(tr("Edit"));
        editToolBar->addAction(cutAct);
        editToolBar->setIconSize(QSize(16, 16));
    }
    
    void CModEditor::interCom()
    {
        connect(cutAct, SIGNAL(triggered()), this, SLOT(cut()));
    }
    

    build.pro

    CONFIG      -= app_bundle
    HEADERS         = CModDocument.h   CModEditor.h
    SOURCES         = CModDocument.cpp CModEditor.cpp main.cpp
    

1 个答案:

答案 0 :(得分:2)

问题似乎是您尝试将QMainWindow配置为两个QWidget的父级。我修改了你的main()函数,如下所示:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow wnd;

    QWidget w;

    // init CA
    CModDocument a(&wnd, &w);

    // init CB
    CModEditor b(&wnd, &w);

    wnd.show();

    return app.exec();
}

请注意父母QWidget wa的新b。我甚至不确定我的方法是否足够(可能不是)。我认为最好将QLayout添加到w并将ab添加到QLayout。然后,您可以将w设置为wnd的中央窗口小部件。