0

これは Qt Creator で行います。QStackedLayout を QComboBox ではなく QPushButton のみで変更したいと考えています。これは可能ですか?誰かがこれを実装しましたか?Qt Documentation から多くの例を入手しましたが、すべての例で QComboBox (現在は必要な QPushButton) を使用しています。これは私のコードです:

#mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

Dialog::Dialog()
{
    QVBoxLayout *mainlayout     =   new QVBoxLayout;
    QVBoxLayout *layouta        =   new QVBoxLayout;
    QVBoxLayout *layoutb        =   new QVBoxLayout;
    QPushButton *tombola        =   new QPushButton("A");
    QPushButton *tombolb        =   new QPushButton("B");
    QPushButton *tombolc        =   new QPushButton("C");
    QFrame      *framea         =   new QFrame;
    QFrame      *frameb         =   new QFrame;
    QStackedLayout *stackia     =   new QStackedLayout;

    layouta->addWidget(tombola);
    layoutb->addWidget(tombolb);

    framea->setLayout(layouta);
    frameb->setLayout(layoutb);
    framea->setMinimumSize(88,88);
    frameb->setMinimumSize(88,88);

    //building frame
    framea->setFrameShape(QFrame::StyledPanel);
    framea->setFrameShadow(QFrame::Raised);
    frameb->setFrameShape(QFrame::StyledPanel);
    frameb->setFrameShadow(QFrame::Raised);

    //get c button smaller
    tombolc->setMaximumWidth(33);

    stackia->addWidget(framea);
    stackia->addWidget(frameb);
    stackia->addWidget(tombolc);

    mainlayout->addLayout(stackia);
    QPushButton     *tombold    =   new QPushButton("D");
    mainlayout->addWidget(tombold);
    setLayout(mainlayout);

    connect(tombold, SIGNAL(clicked()), stackia, SLOT(setCurrentIndex(1))); //CONNECTOR
}

結果

Qt 作成者 言います:

Object::connect: そのようなスロットはありません QStackedLayout::setCurrentIndex(1)

私の間違いは何ですか?

検索して 4 日間尋ねた後の 2 回目のチャンスで、connect() と関数コードを次のように変更しました。

コネクタ:

connect(tombold, SIGNAL(clicked()), stackia, SLOT(change_stack()));

FUNCTION : 無効 Dialog::change_stack() { stackia->setCurrentIndex(1); }

結果

しかし、Qt Creator は次のように述べています。

Object::connect: そのようなスロットはありません QStackedLayout::change_stack()

そしてすぐに窓が閉まりました。

私の目には、私のコードにはエラーがあります。しかし、どのエラーが発生したのかわからないため、QStackLayout のコンテンツ/ページを別のページに変更することはできません。私の間違いは何ですか?これは実際には非常に単純だと思いますが、エラーがどこにあるのかわかりません。

なにか提案を?

4

2 に答える 2

0

クラスにchange_stack関数を追加し、次のように接続する必要があります。Dialog

class Dialog : public QWidget
{
    ...
    private slots:
    void change_stack();

private:
    QStackedLayout *stackia;
}

Dialog::Dialog
{
    ...
    connect(tombold, SIGNAL(clicked()), this, SLOT(change_stack()));
    ...
}


void Dialog::change_stack()
{
    stackia->setCurrentIndex(1);
}
于 2013-07-29T06:35:57.263 に答える
0

について

connect(tombold, SIGNAL(clicked()), stackia, SLOT(setCurrentIndex(1))); 

スロットには、信号と同じ数のパラメーターまたは少ないパラメーターのみを含めることができます。例えば、あなたができる

connect( sender  , SIGNAL( somethingHappened( const QString& ) ),
         receiver, SLOT  ( doSomething      ( const QString& ) ) );

そして、あなたはすることができます

// connect signal and ignore the parameter
connect( sender  , SIGNAL( somethingHappened( const QString& ) ),
         receiver, SLOT  ( doSomethingElse  (                ) ) );

しかし、あなたはできません

// this will not work
connect( sender  , SIGNAL( somethingElseHappened(                ) ),
         receiver, SLOT  ( doSomething          ( const QString& ) ) );

おそらくあなたが望むのは次のようなものです:

Dialog::Dialog
{
    ...
    // This must be a member variable
    _stackia = new QStackedLayout();

    tombola->setProperty( "tabpage", 1 );
    tombolb->setProperty( "tabpage", 2 );
    tombolc->setProperty( "tabpage", 3 );

    connect( tombola, SIGNAL( clicked       () ),
             this   , SLOT  ( tombol_clicked() ) );
    connect( tombolb, SIGNAL( clicked       () ),
             this   , SLOT  ( tombol_clicked() ) );
    connect( tombolc, SIGNAL( clicked       () ),
             this   , SLOT  ( tombol_clicked() ) );
}

// This must be defined as slot in the header
void Dialog::tombol_clicked()
{
    int index = sender()->property( "tabpage" ).toInt();
    _stackia->setCurrentIndex( index );
}
于 2013-07-29T06:36:12.807 に答える