我想使用 Qt 设计一个 GUI。其中包含行和复选框,它们像这样相互连接:
----------[ ]-----------
------[ ]---------[ ]-------------
(其中破折号表示行,[] 表示复选框)
线条是动态创建的。并且选中该复选框将禁用相应的行。所以基本上线条和复选框应该在同一层。
任何有关实施的提示/链接表示赞赏。
我想使用 Qt 设计一个 GUI。其中包含行和复选框,它们像这样相互连接:
----------[ ]-----------
------[ ]---------[ ]-------------
(其中破折号表示行,[] 表示复选框)
线条是动态创建的。并且选中该复选框将禁用相应的行。所以基本上线条和复选框应该在同一层。
任何有关实施的提示/链接表示赞赏。
您将需要QFrame、QCheckBox和QHBoxLayout的组合。对于一些更花哨的东西,您可以为每个部分子类化您自己的 QWidget,并将它们增量添加到 QVBoxLayout。像这样的东西...
class CheckLine : public QWidget
{
Q_OBJECT
public:
CheckLine(int numboxes = 1, QObject* parent = 0) :
QWidget(parent)
{
m_layout = new QHBoxLayout;
m_layout->setSpacing(0); //you can also set the margins to zero if need be
setLayout(m_layout);
QFrame* firstline = new QFrame();
firstline->setFrameShape(QFrame::HLine);
m_layout->addWidget(firstline);
m_lines.append(firstline);
for(int i = 0; i < numboxes; ++i)
addBox();
}
void addBox()
{
QCheckBox* newbox = new QCheckBox(""); //add text here - or leave it blank if you want no label
m_newbox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
m_layout->addWidget(newbox);
m_boxes.append(newbox);
QFrame* newline = new QFrame();
newline->setFrameShape(QFrame::HLine);
m_layout->addWidget(newline);
m_lines.append(newline);
/* link each checkbox to disable the line after it */
connect(newbox, SIGNAL(toggled(bool)), newline, SLOT(setEnabled(bool)));
// connect(newbox, SIGNAL(toggled(bool)), this, SLOT(setEnabled(bool))); //use this instead if you want it to disable the entire row
}
private:
QHBoxLayout* m_layout;
QList<QCheckBox*> m_boxes;
QList<QFrame*> m_lines;
};
然后,创建一个带有 QVBoxLayout 和new
CheckLine 的小部件,每次递增numboxes
1。如果您希望任何复选框禁用整行,请调整代码。