QT висит моя панель инструментов и ее кнопки - PullRequest
3 голосов
/ 10 июля 2011

Я создал 2 класса, каждый:

  1. имеет QWidget в качестве родителя
  2. имеет Q_OBJECT макросов
  3. , выполняет некоторые действия, создаетМеню и панель инструментов, и подключает к ним действия

Затем я создал основной файл программы, создал 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 Ответ

2 голосов
/ 28 июля 2011

Кажется, проблема в том, что вы пытаетесь настроить QMainWindow в качестве родительского для двух QWidget s. Я изменил вашу 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 w, которые родители a и b. Я даже не уверен, что мой подход адекватен (вероятно, нет). Я думаю, что лучше добавить QLayout к w и добавить a и b к этому QLayout. Тогда вы можете установить w как центральный виджет wnd.

...