我在Qt Creator中这样做。我想用QPushButton更改我的QStackedLayout,而不是QComboBox。这可能吗?有人实现了吗?我从Qt文档中获得了许多示例,但所有示例都使用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
}
RESULT
Qt Creator说:
Object :: connect:没有这样的插槽QStackedLayout :: setCurrentIndex(1)
我的错误是什么?
在搜索并询问4天之后,我已经将connect()和函数代码更改为:
连接器:
connect(tombold, SIGNAL(clicked()), stackia, SLOT(change_stack()));
功能: void Dialog :: change_stack() { stackia-> setCurrentIndex(1); }
RESULT
但是Qt Creator说:
Object :: connect:没有这样的插槽QStackedLayout :: change_stack()
并立即关闭窗口。
在我看来,我的代码有错误。但我不知道是什么错误所以我无法将QStackLayout内容/页面更改为另一个页面。我的错是什么?我相信这实际上很简单,但我不知道错误在哪里。
有什么建议吗?
答案 0 :(得分: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);
}
答案 1 :(得分: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 );
}