前言
-
很久前就想拿到界面相关的技术栈,主要用于调试一些接口和小工具, 关于界面的框架比较多, 有Android,也有Qt之类的, 因为做的后端都是和c/c++打交道,加上Qt可移植很高, 所以就选择它吧。
-
针对版本,因为前期没有接触太多Qt,索性就从最新的Qt6.6开始吧。
-
整体感觉Qt还是比较简单的, 只要花销时间即可,不会遇到无法跨越的疑难问题。
组件UI
是选择可视化UI设计还是代码化UI设计, 虽然可视化UI省掉了很多工作量,但:
UI的可视化设计是对用户而言的,其实底层都是C++的代码实现,只是Qt巧妙地进行了处理。
由于界面设计的底层还是C++语言实现的,底层实现的功能比可视化设计更加强大和灵活。
某些界面效果是可视化设计无法完成的。
因为从零开始,后续熟悉组件以及Qt的库相关,所以还是尽量使用代码化UI设计吧。
可视化UI设计
这里不详细展开,大概是通过界面方式使用组件面板中的组件完成界面的设计。
代码化UI设计
- 砍掉ui相关的指针以及相关的调用。
- 组件<私有数据>使用指针方式创建,可以集中使用一个init方法初始化,例如initUI();
void QWDlgManual::initUI()
{
// chkBoxUnder = new QCheckBox(tr("Underline"));
chkBoxItalic = new QCheckBox(tr("Italic"));
chkBoxBold = new QCheckBox(tr("Bold"));
QHBoxLayout *HLay1 = new QHBoxLayout;
HLay1->addWidget(chkBoxUnder);
HLay1->addWidget(chkBoxItalic);
HLay1->addWidget(chkBoxBold);
rBtnBlack = new QRadioButton(tr("Black"));
rBtnBlack->setChecked(true);
rBtnRed = new QRadioButton(tr("Red"));
rBtnBlue = new QRadioButton(tr("Blue"));
QHBoxLayout * HLay2 = new QHBoxLayout;
HLay2->addWidget(rBtnBlack);
HLay2->addWidget(rBtnRed);
HLay2->addWidget(rBtnBlue);
btnOk = new QPushButton(tr("确定"));
btnCancel = new QPushButton(tr("取消"));
btnClose = new QPushButton(tr("退出"));
QHBoxLayout *HLay3 = new QHBoxLayout;
HLay3->addStretch();
HLay3->addWidget(btnOk);
HLay3->addWidget(btnCancel);
HLay3->addStretch();
HLay3->addWidget(btnClose);
txtEdit = new QPlainTextEdit;
txtEdit->setPlainText("Hello world\n\nIt is my demo");
QFont font = txtEdit->font(); //获取字体
font.setPointSize(20);//设置字体
txtEdit->setFont(font);
//创建垂直布局,并设置主布局
QVBoxLayout *VLay = new QVBoxLayout;
VLay->addLayout(HLay1);
VLay->addLayout(HLay2);
VLay->addWidget(txtEdit);
VLay->addLayout(HLay3);
setLayout(VLay); //设置主窗体的主布局
}
- 信号与槽也采用init的方式初始化, 譬如
iniSignalSlots()
void QWDlgManual::iniSignalSlots()
{
connect(rBtnBlue, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
connect(rBtnBlack, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
connect(rBtnRed, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
connect(chkBoxUnder, SIGNAL(clicked(bool)),this, SLOT(on_chkBoxUnder(bool)));
connect(chkBoxItalic, SIGNAL(clicked(bool)), this, SLOT(on_chkBoxItalic(bool)));
connect(chkBoxBold, SIGNAL(clicked(bool)), this, SLOT(on_chkBoxBold(bool)));
connect(btnOk, SIGNAL(clicked()), this, SLOT(accept()));
connect(btnCancel, SIGNAL(clicked()), this, SLOT(reject()));
connect(btnClose, SIGNAL(clicked()), this, SLOT(clise()));
}
- 实现槽的方法
没有过于复杂的新东西,比Linux中的信号简单太多 。信号好比是中断,如果熟悉linux环境编程,应该比较熟悉软中断,内核向用户态发信号,用户态可以对信号做一些处理,比如忽略信号或抓捕信号, 其中抓捕信号就好比槽函数。
void QWDlgManual::on_chkBoxItalic(bool checked)
{
QFont font = txtEdit->font();
font.setItalic(checked);
txtEdit->setFont(font);
}
void QWDlgManual::setTextFontColor()
{
QPalette plet = txtEdit->palette();
if(rBtnBlue->isChecked()){
plet.setColor(QPalette::Text, Qt::blue);
}
if(rBtnRed->isChecked())
plet.setColor(QPalette::Text, Qt::red);
if(rBtnBlack->isChecked())
plet.setColor(QPalette::Text, Qt::black);
txtEdit->setPalette(plet);
}
展望后续
- 组件/布局的熟悉和使用
- 网络编程,图像处理, 音视频相关
- 类似QT的STL之类的东西


1124

被折叠的 条评论
为什么被折叠?



