Проблемы с QStatusBar-> showMessage () - PullRequest
2 голосов
/ 04 марта 2011

Я пишу приложение Qt GUI, но есть странная ошибка, которую я не могу понять; Вот весь код: main.cpp

#include "LevelEditor.h"
int main(int argc, char* argv[])
{
    LevelEditor editor(argc, argv);
    editor.go();
    return 0;
}

LevelEditor.h

#ifndef LEVELEDITOR_H
#define LEVELEDITOR_H

#include <QtGui>

class LevelEditor
{
    public:
        LevelEditor(int argc, char* argv[]);
        ~LevelEditor();
        void go();
    protected:
        QApplication* app;
        QMainWindow* main_window;
        QMenuBar* menu_bar;
        QStatusBar* status_bar;
        QWidget* central;
        QMenu* menu_entry[3];
        QFrame* about_frame;

        QList<QAction*> file_actions;
        QList<QAction*> edit_actions;
        QList<QAction*> help_actions;
    private:
};

#endif // LEVELEDITOR_H

LevelEditor.cpp

#include "LevelEditor.h"
#include <QStatusBar>
LevelEditor::LevelEditor(int argc, char* argv[])
{
    //initialise main objects
    app = new QApplication(argc, argv);
    main_window = new QMainWindow();
    menu_bar = main_window->menuBar();
    status_bar = main_window->statusBar();
    central = main_window->centralWidget();
    about_frame = new QFrame();

    //initialise menu entries and actions
    menu_entry[0] = new QMenu();    //file
    menu_entry[1] = new QMenu();    //edit
    menu_entry[2] = new QMenu();    //about

    //creating and connecting events to action
    menu_entry[0]->setTitle("File");
    file_actions.append(new QAction("New", menu_entry[0]));
    file_actions.append(new QAction("Open", menu_entry[0]));
    file_actions.append(new QAction("Save", menu_entry[0]));
    file_actions.append(new QAction("Quit", menu_entry[0]));
    QObject::connect(file_actions.back(), SIGNAL(triggered()), app, SLOT(quit()));
    QObject::connect(file_actions.back(), SIGNAL(hovered()), status_bar, SLOT(showMessage("Quit this App"));
    menu_entry[0]->addActions(file_actions);
    menu_bar->addMenu(menu_entry[0]);

    //edit menu
    menu_entry[1]->setTitle("Edit");
    edit_actions.append(new QAction("Cut", menu_entry[1]));
    edit_actions.append(new QAction("Copy", menu_entry[1]));
    edit_actions.append(new QAction("Paste", menu_entry[1]));
    menu_entry[1]->addActions(edit_actions);
    menu_bar->addMenu(menu_entry[1]);

    //help menu
    help_actions.append(new QAction("About", menu_entry[2]));
    QObject::connect(help_actions.back(), SIGNAL(triggered()), about_frame, SLOT(show()));
    menu_entry[2]->setTitle("Help");
    menu_entry[2]->addActions(help_actions);
    menu_bar->addMenu(menu_entry[2]);

    about_frame->resize(400,300);
}

LevelEditor::~LevelEditor()
{
    //dtor
}

void LevelEditor::go()
{
    //nothing
    main_window->showMaximized();
    menu_bar->show();
    status_bar->show();
    app->exec();
}

Этот код прекрасно компилируется без ошибок. Во всяком случае, консоль отладки дает мне предупреждение QObject :: connect: НЕТ такого слота & QStatusBar :: showMessage («Выйти из этого приложения»)

Проблема, похоже, связана с этой строкой:

QObject::connect(file_actions.back(), SIGNAL(hovered()), status_bar, SLOT(showMessage("Quit this App"));

Я искал в "QStatusBar.h" функцию showMessage, и она объявлена, но не может быть вызвана ни с помощью "." ни "->" (даже если это публично). Также попробовал это: QObject::connect(file_actions.back(), SIGNAL(hovered()), status_bar, SLOT(showMessage("Quit this App", 0));

и это: QObject::connect(file_actions.back(), SIGNAL(hovered()), status_bar, SLOT(QStatusBar::showMessage("Quit this App"));

Но безрезультатно, он просто не распознает функцию.

Я что-то здесь упускаю? Заранее спасибо.

РЕДАКТИРОВАТЬ: Решено, я выбрал трудный способ показать текст состояния вместо использования QAction :: setStatusTip, мой плохой.

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Вы не можете подключить сигнал к слоту с другой подписью. И вы даже не используете правильный синтаксис подключения. Часть SLOT должна быть:

SLOT(showMessage(const QString &))

Это мета-объектная система, которая сообщает тип (ы) параметров для отправки в слот, а не конкретные данные для отправки.

В вашем случае вы не можете подключить сигнал без параметров к слоту, который ожидает его. Вы можете добиться этого, подключив сигнал к своему собственному слоту, а затем вызовите QStatusBar :: showMessage оттуда.

1 голос
/ 09 марта 2011

Вы можете использовать QSignalMapper, чтобы делать то, что вы хотите:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(file_actions.back(), SIGNAL(hovered()), mapper, SLOT(map()));
mapper->setMapping(file_actions.back(), "Quit this app");
connect(mapper, SIGNAL(mapped(const QString &)), statusBar, SLOT(showMessage(const QString &));

Использование QSignalMapper позволяет вам просто добавить еще одно «зависшее» сообщение без создания новых слотов для каждого.Просто для всех остальных случаев просто используйте:

mapper->setMapping(yourAction/Button/Whater, "Your status message");
QObject::connect(yourAction/Button/Whater, SIGNAL(hovered/Other signal()), mapper, SLOT(map()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...