Qt Gui 第六章布局管理
1、QRadioButton之间如何互斥
其中一种方法是将各个QRadioButton控件放在同一个toolbarsLayout或者toolbarsGroupBox即可;如下所示
toolbarsGroupBox = new QGroupBox(tr("Show toolbars as")); picturesAndTextRadioButton = new QRadioButton(tr("Pictures and text")); picturesOnlyRadioButton = new QRadioButton(tr("Pictures only")); textOnlyRadioButton = new QRadioButton(tr("Text only")); QVBoxLayout* toolbarsLayout = new QVBoxLayout; toolbarsLayout->addWidget(picturesAndTextRadioButton); toolbarsLayout->addWidget(picturesOnlyRadioButton); toolbarsLayout->addWidget(textOnlyRadioButton); toolbarsGroupBox->setLayout(toolbarsLayout);
如上图所示:将picturesAndTextRadioButton、picturesOnlyRadioButton和textOnlyRadioButton放在同一个toolbarsLayout里面;即会产生互斥;
总结:控件间的互斥即将QRadioButton放在同一个父窗口,则这些同一个父窗口的控件(layout窗口也算)即产生互斥;
也可以通过构造函数中直接指定父窗口:QRadioButton(const QString &text, QWidget *parent = Q_NULLPTR)、QRadioButton(QWidget *parent = Q_NULLPTR)
信号连接:当radiobutton按钮被点击的时候会触发两个信号,toggled(bool)和clicked();咱们一般是用toggled(bool),因为该信号会传入radiobutton的状态是选中还是不选中。
2、QGridLayout
QVBoxLayout、QHBoxLayout和QGridLayout都直接或间接继承QLayout;
QGridLayout即网格的布局形式;比QVBoxLayout和QHBoxLayout的使用更灵活但是使用过程中也是更复杂;需要指定竖排和横排的顺序;还有占用的位置个数等;
QGridLayout *leftLayout = new QGridLayout; leftLayout->addWidget(namedLabel, 0, 0); leftLayout->addWidget(namedLineEdit, 0, 1); leftLayout->addWidget(lookInLabel, 1, 0); leftLayout->addWidget(lookInLineEdit, 1, 1); leftLayout->addWidget(subfoldersCheckBox, 2, 0, 1, 2); leftLayout->addWidget(tableWidget, 3, 0, 1, 2); leftLayout->addWidget(messageLabel, 4, 0, 1, 2);
QGridLayout的addWidget
inline void addWidget(QWidget *w) { QLayout::addWidget(w); } void addWidget(QWidget *, int row, int column, Qt::Alignment = Qt::Alignment()); void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment()); void addLayout(QLayout *, int row, int column, Qt::Alignment = Qt::Alignment()); void addLayout(QLayout *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment());
如上rowSpan和columnSpan是指要占用的行和竖的位置个数;默认是1;
如row和column是指定在这个QGridLayout布局下,要排在第几行第几列;
3、QStackedLayout
该函数也是继承QLayout;即可以在该页面放置多个窗口。但是该控件的特性是,一次只能显示一个窗口。
a stack of widgets where only one widget is visible at a time。
stackedLayout = new QStackedLayout; stackedLayout->addWidget(appearancePage); stackedLayout->addWidget(webBrowserPage); stackedLayout->addWidget(mailAndNewsPage); stackedLayout->addWidget(advancedPage);
如上所示,只能显示其中一个页面;其他页面隐藏状态;但是可以通过setCurrentIndex(int)函数来指定当前要显示的是哪个页面;
但是特殊情况下,可以显示所有的页面;通过:stackedLayout->setStackingMode(QStackedLayout::StackAll); 但是除了设置的currentindex外,其他的页面都是disable的状态;
4、QSplitter
用来切割窗口的部件;可横向切割也可纵向切割;将窗口切割成上下n部分:rightSplitter = new QSplitter(Qt::Vertical);
将窗口切成左右n部分mainSplitter = new QSplitter(Qt::Horizontal);
rightSplitter = new QSplitter(Qt::Vertical); rightSplitter->addWidget(messagesTreeWidget); rightSplitter->addWidget(textEdit); rightSplitter->setStretchFactor(1, 1); mainSplitter = new QSplitter(Qt::Horizontal); mainSplitter->addWidget(foldersTreeWidget); mainSplitter->addWidget(rightSplitter); mainSplitter->setStretchFactor(1,1); setCentralWidget(mainSplitter);
关于指定拉伸的,rightSplitter->setStretchFactor(1, 1) 因为rightSplitter 是指定Qt::Vertical 的,所以当水平拉伸的时候,对控件是否设置了拉伸是没有影响的;只影响到竖直的情况。
同理 mainSplitter->setStretchFactor(1,1); 只影响到了水平拉伸;
5、树形结构
QStringList folderLabels; folderLabels << tr("Folders"); foldersTreeWidget = new QTreeWidget; foldersTreeWidget->setHeaderLabels(folderLabels); addFolder(folderIcon, tr("Inbox")); addFolder(folderIcon, tr("Outbox")); addFolder(folderIcon, tr("Sent")); addFolder(trashIcon, tr("Trash")); void MailClient::addFolder(const QIcon &icon, const QString &name) { QTreeWidgetItem *root; if (foldersTreeWidget->topLevelItemCount() == 0) { root = new QTreeWidgetItem(foldersTreeWidget); root->setText(0, tr("Mail")); foldersTreeWidget->setItemExpanded(root, true); } else { root = foldersTreeWidget->topLevelItem(0); } QTreeWidgetItem *newItem = new QTreeWidgetItem(root); newItem->setText(0, name); newItem->setIcon(0, icon); if (!foldersTreeWidget->currentItem()) foldersTreeWidget->setCurrentItem(newItem); }
如上图所示是建图的过程;
先建一个QTreeWidget用来装树形结构的容器
新建root节点的时候,通过构造函数指定root节点的父窗口 root = new QTreeWidgetItem(foldersTreeWidget);
同理在创建各个节点的时候,要指明自己的父节点是哪个 QTreeWidgetItem *newItem = new QTreeWidgetItem(root);
关于newItem->setText(0, name); 其中的0,1,2;这个可以通过如下图直观看出:
因为树节点都是只有一列;所以全都是0;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!