QT_对话框
建议参考
- 模态对话框,就是会阻塞同一应用程序中其它窗口的输入。
模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。
- 非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。
Qt 的内置对话框大致分为以下几类:
自定义对话框
Qt 支持模态对话框和非模态对话框。
模态与非模态的实现:
使用QDialog::exec()实现应用程序级别的模态对话框
- 1
使用QDialog::open()实现窗口级别的模态对话框
- 1
使用QDialog::show()实现非模态对话框。
- 1
Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。
QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:
如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。
顶层窗口与非顶层窗口的区别在于:/*顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。*/
#include
#include
#include
#include
//点击新建菜单项,弹出对话框
connect(ui->actionnew,&QAction::triggered,this,[=](){
// qDebug()<<"弹出对话框"<
//对话框 有两种
//模态对话框: 对话框开启状态不可以对其它窗口进行操作
//非模态对话框:对话框开启状态是可以对其它窗口进行操作的
//模态方式创建
// QDialog dlg(this); // 父组件的子对话框。
// dlg.resize(200,100);
// dlg.exec(); //阻塞功能 应用程序级别 dlg创建到栈上,没有被释放掉是因为exec()阻塞。
// qDebug()<<"弹出对话框"<
//非模态方式创建 ,不使用阻塞
// QDialog dlg2(this); //创建到栈上,不使用阻塞的话一闪而过
// dlg2->show(); //不使用阻塞的话一闪而过。show函数之后该Lambda表达式结束退出,则dlg2局部对象被销毁。对话框消失。
// QDialog * dlg2 = new QDialog(this); //new出来的this对象在堆上,创建成widget的children表(this),这样只有在widget窗口关闭时才会释放!!!只有this对象析构才会被释放,这里this是整个widget窗口。如果没有这个this依赖(QDialog * dlg2 = new QDialog),则创建的对象需要手动delete才能删除(delete QDialog)。
// dlg2->resize(200,100);
// dlg2->show();
// //设置dlg2的属性
// dlg2->setAttribute(Qt::WA_DeleteOnClose); //点击对话框的关闭按钮时,释放掉该内存
//设置标准对话框 QMessageBox
// QMessageBox::critical(this,"错误"," critical");
// QMessageBox::information(this,"信息"," info");
//参数1 父亲, 2:标题 3:提示内容 4:按键类型 5:关联回车的按键
// QMessageBox::question(this,"询问对话框","question",QMessageBox::Save | QMessageBox::Cancel);
// if(QMessageBox::Save == QMessageBox::question(this,"询问对话框","question",QMessageBox::Save | QMessageBox::Cancel))
// {
// qDebug()<<"点击的是保存"<
// }
// else {
// qDebug()<<"点击的是取消"<
// }
//选择颜色对话框
QColor color_choose = QColorDialog::getColor(QColor(255,0,0));
qDebug()<<color_choose.red()<<color_choose.blue()<<color_choose.green();
//文件对话框,caption:标题 dir:路径 filter:显示哪些类型的文件(过滤功能)
// QFileDialog::getOpenFileName(this,"打开文件","D:\\00_MyDate\\QT","(*.txt *.png)"); //注意.修改为双斜杠
// QString path = QFileDialog::getOpenFileName(this,"打开文件","D:\\00_MyDate\\QT","(*.txt *.png)");
// qDebug()<
QString name = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择视频文件")); //fromLocal8Bit : 默认代码可能会中文出现乱码
if (name.isEmpty())return; //如果没有选中文件,则name为空!
string file = name.toLocal8Bit().data(); //中文转换, 非中文文件没问题。 中文则要通过toLocal8Bit转换为utf8格式。
#include
#include
#include
//例程1
QString curPath=QDir::currentPath();//获取系统当前目录
//获取应用程序的路径
QString dlgTitle="选择一个文件"; //对话框标题
QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
if (!aFileName.isEmpty())
ui->plainTextEdit->appendPlainText(aFileName);
}
//例程2
void XVideoUI::Open()
{
QString name = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择视频文件")); //fromLocal8Bit : 默认代码可能会中文出现乱码
if (name.isEmpty())return;
string file = name.toLocal8Bit().data(); //中文转换, 非中文文件没问题。 中文则要通过toLocal8Bit转换为utf8格式。
//QMessageBox::information(this, "", name);
if (!XVideoThread::Get()->Open(file))
{
QMessageBox::information(this, "error", name + " open failed!");
return;
}
Play(); //打开默认播放
}
//打开一号视频源文件
static VideoCapture cap1;//一号视频源
bool XVideoThread::Open(const std::string file)
{
cout << "open :" << file << endl;
mutex.lock();
bool re = cap1.open(file);
mutex.unlock();
cout << re << endl;
if (!re)
return re;
fps = cap1.get(CAP_PROP_FPS); //获取fps
width = cap1.get(CAP_PROP_FRAME_WIDTH); //获取视频的宽、高
height = cap1.get(CAP_PROP_FRAME_HEIGHT);
if (fps <= 0) fps = 25; //万一没取到值。则取一个自定义值
src1file = file; //打开时记录文件名
double count = cap1.get(CAP_PROP_FRAME_COUNT);
totalMs = (count / (double)fps) * 1000; //总帧数/fps = 秒时长, 换算为毫秒
return true;
}
QColorDialog 对话框
QColorDialog 是选择颜色对话框,选择颜色使用静态函数QColorDialog::getColor()。下面是
“选择颜色”按钮的代码,它为文本框的字体选择颜色。
void Dialog::on_btnColor_clicked()
{
QPalette pal=ui->plainTextEdit->palette(); //获取现有palette
QColor iniColor=pal.color(QPalette::Text); //现有的文字颜色
QColor color=QColorDialog::getColor(iniColor,this,"选择颜色");
if (color.isValid()) //选择有效
{
pal.setColor(QPalette::Text,color); //palette 设置选择的颜色
ui->plainTextEdit->setPalette(pal); //设置palette
}
}
QFontDialog 是选择字体对话框,选择字体使用静态函数QFontDialog::getFont()。下面是“选
择字体”按钮的代码,它为文本框选择字体,字体设置的内容包括字体名称、大小、粗体、
斜体等。
void Dialog::on_btnFont_clicked()
{//选择字体
QFont iniFont=ui->plainTextEdit->font(); //获取文本框的字体
bool ok=false;
QFont font=QFontDialog::getFont(&ok,iniFont); //选择字体
if (ok) //选择有效
ui->plainTextEdit->setFont(font);
}
QInputDialog 标准输入对话框
QInputDialog 有单行字符串输入、整数输入、浮点数输入、列表框选择输入和多行文本等多种输入方式,图3 是其中4 种界面效果。
void Dialog::on_btnInputString_clicked()
{ //输入字符串
QString dlgTitle="输入文字对话框";
QString txtLabel="请输入文件名";
QString defaultInput="新建文件.txt";
QLineEdit::EchoMode echoMode=QLineEdit::Normal;//正常文字输入
//QLineEdit::EchoMode echoMode=QLineEdit::Password;//密码输入
bool ok=false;
QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &ok);
if (ok && !text.isEmpty())
ui->plainTextEdit->appendPlainText(text);
}
简单信息提示
消息对话框QMessageBox 用于显示提示、警告、错误等信息,或进行确认选择,由几个静态函数实现这些功能。其中warning()、information()、critical() 和about() 这几个函数的输入参数和使用方法相同,只是信息提示的图标有区别。
void Dialog::on_btnMsgInformation_clicked()
{
QString dlgTitle="information 消息框";
QString strInfo="文件已经打开,字体大小已设置";
QMessageBox::information(this, dlgTitle, strInfo,
QMessageBox::Ok,QMessageBox::NoButton);
}
void Dialog::on_btnMsgWarning_clicked()
{
QString dlgTitle="warning 消息框";
QString strInfo="文件内容已经被修改";
QMessageBox::warning(this, dlgTitle, strInfo);
}
void Dialog::on_btnMsgCritical_clicked()
{
QString dlgTitle="critical 消息框";
QString strInfo="有不明程序访问网络";
QMessageBox::critical(this, dlgTitle, strInfo);
}
void Dialog::on_btnMsgAbout_clicked()
{
QString dlgTitle="about 消息框";
QString strInfo="我开发的数据查看软件V1.0 \n 保留所有版权";
QMessageBox::about(this, dlgTitle, strInfo);
}
继承自QDialog 对话框
class QWDialogSize : public QDialog
{
Q_OBJECT
public:
explicit QWDialogSize(QWidget *parent = 0);
~QWDialogSize();
int rowCount();//获取对话框输入的行数
int columnCount();//获取对话框输入的列数
void setRowColumn(int row, int column); //初始对话框上两个SpinBox 的值
private slots:
private:
Ui::QWDialogSize *ui;
};