【qt】最快的开发界面效率——混合编程2:https://developer.aliyun.com/article/1507183
四.完成界面的功能
1.对action配置信号槽
在这里有一个信号槽编辑器
这里可以进行信号槽的添加
对于信号和槽函数,qt内部都已经实现好的,才可以在这里直接进行配置。
这里我们就对剪切,复制,退出,清空,粘贴进行了添加
因为这些槽函数对应的接收者有对应的槽函数
对于action有一个共同的信号就是triggered触发器
运行结果:
点击清空就没了
2.对action转到信号槽
OK,接下来,就是我们想要实现的功能,qt组件内部没有对应的函数,那就只能我们手动去写了
但是还是有action的触发器信号
我们可以直接在action上点击转到槽
对于下划线,粗体,斜体因为有两种状态,我们用triggered(bool)这个信号。
新建的槽函:
void MainWindow::on_actionNew_triggered() { ui->textEdit->clear();//将当前的文本清空 fileName->setText("当前文件");//文件名也清空 }
打开文件的槽函数:
void MainWindow::on_actionOpen_triggered() { //打开一个文件并获取路径 QString FileName=QFileDialog::getOpenFileName(this,"打开一个文件"); if(!FileName.isEmpty())//如果路径不为空 { QFile file(FileName);//创建一个文件对象用路径名初始化 if(file.open(QIODevice::ReadWrite|QIODevice::Text))//打开文件 { QTextStream stream(&file);//创建一个文件流对象 while(!stream.atEnd())//如果没有读到结尾 { ui->textEdit->append(stream.readLine());//将读的每行添加到文件流中,然后尾部追加到文本编辑器中 } fileName->setText("当前文件:"+FileName);//将当前的文件名进行修改 } file.close();//关闭文件 } }
3个字体样式的槽函数:
void MainWindow::on_actionBold_triggered(bool checked) { auto format=ui->textEdit->currentCharFormat();//获取光标位置的字体样式 format.setFontWeight(checked?QFont::Bold:QFont::Normal);//根据状态修改成粗体样式 ui->textEdit->mergeCurrentCharFormat(format);//将修改后样式合并到字体样式中 } void MainWindow::on_actionItalic_triggered(bool checked) { auto format=ui->textEdit->currentCharFormat(); format.setFontItalic(checked); ui->textEdit->mergeCurrentCharFormat(format); } void MainWindow::on_actionUnderLine_triggered(bool checked) { auto format=ui->textEdit->currentCharFormat(); format.setFontUnderline(checked); ui->textEdit->mergeCurrentCharFormat(format); }
我注释写的这么详细,我就不讲了,如果有不懂的地方可以问我。
运行效果:
打开一个文件和3种样式可以完了,你们可以多玩玩,哈哈。
3.代码添加的组件手动关联槽函数
像我们自己手动添加的组件,我们必须要手动的关联和定义槽函数
字体大小和字体的样式本身有信号,所以不用我们进行手动的添加
先定义槽函数:
void on_spinBoxFontSize_valueChanged(int size); void on_fontBox_currentIndexChanged(const QString & fontStyle);
然后关联:
void MainWindow::initSignalSlots() { connect(spinBoxFontSize,SIGNAL(valueChanged(int)), this,SLOT(on_spinBoxFontSize_valueChanged(int))); connect(fontBox,SIGNAL(currentIndexChanged(const QString &)), this,SLOT(on_fontBox_currentIndexChanged(const QString &))); }
最后实现槽函数:
void MainWindow::on_spinBoxFontSize_valueChanged(int size) { QTextCharFormat format; format.setFontPointSize(size);//根据发来的信号设置文本的大小 ui->textEdit->mergeCurrentCharFormat(format);//将字体大小合并到文本 progressBar->setValue(size);//设置进度条的值 } void MainWindow::on_fontBox_currentIndexChanged(const QString &fontStyle) { QTextCharFormat format; format.setFontFamily(fontStyle); ui->textEdit->mergeCurrentCharFormat(format); }
运行效果:
现在就可以尽情的玩耍了,功能都有了,你也试试看吧!
五.补充
1.样式选择问题
现在还是会有一点小bug,就是如果我点了斜体,粗体,下划线,我选择其他文本文字,他们的状态还是一直点着的。
我们可以用文本编辑器的一个转到槽,有个文本选择改变信号
实现槽函数:
void MainWindow::on_textEdit_selectionChanged() { //先获取当前文本格式 auto format=ui->textEdit->currentCharFormat(); //根据当前的文本判断是否设置了样式 ui->actionBold->setChecked(format.font().bold()); ui->actionItalic->setChecked(format.fontItalic()); ui->actionUnderLine->setChecked(format.fontUnderline()); }
效果:
2.复制粘贴剪切可选
现在有一个需求就是当我们选择文本才可以复制剪切
文本编辑器也有一个信号就是能否复制
实现槽函数:
void MainWindow::on_textEdit_copyAvailable(bool b) { ui->actionCut->setEnabled(b);//如果可以复制就可以使用剪切 ui->actionCopy->setEnabled(b);//如果可以复制就复制 ui->actionPaste->setEnabled(ui->textEdit->canPaste());//如果可以粘贴的时候就设置可以 }
效果:
现在剪切和复制就用不了了,选中就又可以复制和剪切了。
3.图标
扩充内容,最后咱们来搞一个图标。
然后保存到项目同目录下
在pro文件中加一个模块
等于后面与保存在同目录下的名字相同
顺便加一个窗口主题名:
运行结果:
帅呆了,太酷了!
哎呀,其他功能你们做好了,自己玩,我不想截图了…
六.总结
很明显,ui设计器的开发效率极快,但是有的界面只能用代码实现,如我们这个项目中,向工具栏和状态栏里面添加组件时,只能用代码来实现。
总的来说一句话:能用ui设计器的就尽量用,不能用的就用代码!
花了一天的时间,终于写完了,今天星期天,咱们的设计界面就完结撒花了,真的是太累了。确实接口有点多,容易记混,不过慢慢来,重要的是思想!
OK,就到这里吧!(* ̄︶ ̄)