Главное окно QT Creator - как изменить интерфейс для каждого элемента из меню? - PullRequest
1 голос
/ 19 июля 2011

Я новичок в QT Creator.Я создал меню: Логин ||Открыто.При входе в систему я хотел бы видеть редактирование строки и нажатие кнопки.Когда нажата кнопка «Открыть», я хотел бы видеть изображение в окне.Могу ли я изменить интерфейс одного и того же окна в зависимости от того, что я нажимаю в строке меню?Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Я сделал нечто похожее на это - приложение с несколькими основными областями, переключаемое с помощью панели значков вверху. Я использовал QStackWidget для укладки различных областей приложения друг на друга, набор QAction s, который я создал с помощью конструктора, и QActionGroup для осуществления переключения. Когда действия помечены как «проверяемые» и сгруппированы в QActionGroup, QToolBar позволяет активировать только одно в данный момент.

Вот упрощенная выдержка из моего кода:

// MyApp.h
#include <QMainWindow>    
class QAction;
class QActionGroup;

namespace Ui {
    class MyApp;
} 

class MyApp: public QMainWindow
{    
    Q_OBJECT

public:
    explicit MyApp(QWidget *parent = 0);
    ~MyApp();

public slots:
    void showSection(QAction* a);

private:
    Ui::MyApp *ui;
    QActionGroup* sections;
};

//MyApp.cpp
#include "structureapp.h"
#include "ui_structureapp.h"

#include <QActionGroup>

MyApp::MyApp(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MyApp),
    sections(new QActionGroup(this)),
{
    ui->setupUi(this);

    /* Populate section list */

    /* Page indices for the stack widget*/
    ui->actionSectionOne->      setData(0);
    ui->actionSectionTwo->      setData(1);
    ui->actionSectionThree->    setData(2);

    sections->addAction(ui->actionSectionOne);
    sections->addAction(ui->actionSectionTwo);
    sections->addAction(ui->actionSectionThree);


    ui->mainToolBar->addSeparator();

    connect(sections, SIGNAL(triggered(QAction*)), this, SLOT(showSection(QAction*)));

    /* Show the default section */
    ui->actionContentSection->trigger();
}

MyApp::~MyApp()
{   
    delete ui;  
}

void MyApp::showSection(QAction *a)
{
    ui->mainArea->setCurrentIndex(a->data().toInt());
}
0 голосов
/ 19 июля 2011

Да, вы можете.Как я объяснил ранее , каждый пункт меню является сигналом, и это связано со слотом.С двумя разными пунктами меню у вас есть два сигнала, и вы бы подключили их к двум разным слотам.Итак, вы можете назвать свой первый слот onLogin, а второй слот onOpen.(Это помогает выбрать описательные имена, поэтому вы поймете свою программу, когда вернетесь в понедельник).

Теперь в этом слоте onLogin, вы поставили код для входа в систему.В слот onOpen вы кладете другой код.Но подумайте, что произойдет, если вы нажмете две записи меню один за другим.Это вообще возможно?Если нет, вам может понадобиться другое решение.Для входа в систему достаточно использовать QDialog.Когда диалог активен, вы не можете использовать меню основного приложения, поэтому вы не можете случайно нажать onOpen, когда вы заняты входом в систему.

...