QWizard QCheckBox,QRadioButton和QComboBox:信号/插槽和SignalMapping - 所需信息
问题描述:
我想创建一个QWizard。我需要在第一个窗口中使用QRadioButton和QComboBox的组合,并在第二个窗口中使用QCheckBox和QComboBox。QWizard QCheckBox,QRadioButton和QComboBox:信号/插槽和SignalMapping - 所需信息
在第一个窗口中,作为每个RadioButton的文本传出的信息来自指定路径中的目录,而ComboBox列表是RadioButton目录内目录的迭代。
在第二个窗口中,过程与上述相同,而不是单选按钮,但会从另一个目录路径中复选框。
单选按钮和组合框与信号和插槽相互依赖,如果选中一个单选按钮,则必须激活其相应的组合框,并且如果选择了下一个无线电,则必须禁用第一个无线电。但是这并没有发生,Combobox列表每增加一次,当我检查它时,相应的组合框也没有被禁用。
这里是我的代码:
void SelectOption::initializeUi()
{
this->setWindowTitle("Window-1");
QGridLayout *gridLayout1 = new QGridLayout();
gridLayout1->setMargin(5);
gridLayout1->setSpacing(5);
QSignalMapper* signalMapper = new QSignalMapper();
for(int i = 0; i < list.size(); i++){
radioButton[i] = new QRadioButton();
radioButton[i]->setText(softwareList[i]);
signalMapper->setMapping(radioButton[i], i);
gridLayout1->addWidget(radioButton[i], i/1, i%1);
connect(radioButton[i], SIGNAL(clicked()),signalMapper, SLOT(map()));
}
connect(signalMapper, SIGNAL(mapped(const int &)),this, SIGNAL(radioChecked(const int &)));
connect(this, SIGNAL(radioChecked(const int &)),this, SLOT(test(const int)));
QGridLayout *gridLayout2 = new QGridLayout();
gridLayout2->setMargin(5);
gridLayout2->setSpacing(5);
for(int j = 0; j < list.size(); j++){
comboBox[j] = new QComboBox();
comboBox[j]->setDisabled(true);
gridLayout2->addWidget(comboBox[j], j/1, j%1);
}
QPushButton *nextButton = new QPushButton("Next >");
nextButton->setDefault(true);
connect(nextButton, SIGNAL(clicked()), this, SLOT(showMainPage()));
QPushButton *backButton = new QPushButton("< Back");
backButton->setDefault(true);
connect(backButton, SIGNAL(clicked()), this, SLOT(showSelectOS()));
QPushButton *cancelButton = new QPushButton("Cancel");
cancelButton->setDefault(true);
connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancel()));
QHBoxLayout *hboxlayout;
hboxlayout = new QHBoxLayout();
hboxlayout->addLayout(gridLayout1);
hboxlayout->addLayout(gridLayout2);
QHBoxLayout *layout;
layout = new QHBoxLayout();
layout->addStretch(10);
layout->addWidget(nextButton);
layout->addWidget(backButton);
layout->addWidget(cancelButton);
layout->addStretch(10);
QVBoxLayout *mainLayout;
mainLayout = new QVBoxLayout();
mainLayout->addLayout(hboxlayout);
mainLayout->addLayout(layout);
ui->centralwidget->setLayout(mainLayout);
}
void SelectOption::test(const int id) // REMEMBER
{
if(radioButton[id]->isChecked()){
comboBox[id]->setEnabled(true);
comboBox[id]->addItem(" Select anyone ");
QString path = qApp->applicationDirPath() + "/list/" + radioButton[id]->text();
QDir dir;
dir.cd(path);
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList list = dir.entryInfoList();
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
comboBox[id]->addItem(fileInfo.fileName());
}
}else{
comboBox[id]->clear();
comboBox[id]->setDisabled(true);
}
}
答
添加您的所有单选按钮一个QButtonGroup
。然后检查其中一个将取消所有其他人的检查。
更新(代码示例)。
使用QButtonGroup
绝对没有什么困难。您只需要使用void QButtonGroup::addButton (QAbstractButton * button)
方法将QAbstractButton
继承者添加到它,所有其他操作都将自动完成。下面是一个简单的代码示例,在其构造函数的主窗口中添加三个单选按钮:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setupUi(this);
QVBoxLayout *layout = new QVBoxLayout(QMainWindow::centralWidget());
QRadioButton *r1 = new QRadioButton("r1", this);
QRadioButton *r2 = new QRadioButton("r2", this);
QRadioButton *r3 = new QRadioButton("r3", this);
layout->addWidget(r1);
layout->addWidget(r2);
layout->addWidget(r3);
layout->addStretch();
QButtonGroup *group = new QButtonGroup(this);
group->addButton(r1);
group->addButton(r2);
group->addButton(r3);
r1->setChecked(true);
}
感谢您的回复,但QButtonGroup不再可用我想?相反,我必须使用QGroupBox?你可以在我的代码中展示给我... – 2013-04-09 13:49:22
'QButtonGroup'和'QGroupBox'是两个完全不同的东西。你为什么认为它不可用?你使用Qt5吗?这里是:http://qt-project.org/doc/qt-5.0/qtwidgets/qbuttongroup.html – Amartel 2013-04-09 13:53:42
再次感谢,我恐怕我不知道QRadioButtons的QButtonGroup的用法,请你帮我代码?? – 2013-04-09 14:05:41