用Qt做demo:一般步骤和可能用得到的东西

1 利用Qt的.ui文件,拖拽实现所有按钮Button,文字Label,图片Label等等。布局做好了再做逻辑。

2 根据自己的设计,把各种空间名字改好。这一点很重要,因为后续的逻辑代码在显示的时候要找到这个控件的名称。然后设计信号和槽。所谓的信号槽机制,其实我理解很肤浅。用户对控件做了什么事情, 就会发出什么信号(例如点击按键,信号clicked())。程序的某个函数负责做这个事情的响应,就是槽。当然,更深入的理解是会设计到多线程的,暂且不管。设计信号槽,最简单的方法是在Qt designer里面,右键一个控件,例如按钮Butt,然后在右键菜单选择“转到槽”。这时候Qt designer会要求程序员先选中一个信号。系统默认了一些信号,例如经典的clicked,点击按钮嘛~然后在cpp文件以及h文件会自动添加一个函数,一般叫on_xxxx_clicked();  在这个函数里,我们就可以为所欲为,想干嘛干嘛。
更麻烦一点的方法也有。同样是Qt designer里面,进入信号槽机制面板,拖动控件,拉出一个像天线(还是像电线?)的东西,然后弹出一个面板,在面板里面选择相应的信号和槽(一般槽都要自己编辑一个新的,不然就会重写人家的默认函数了)按了确定之后,也会在h文件和cpp文件里面相应地出现槽函数。这时候,也可以为所欲为做想做的事情。
配上几个图:

天线模样的东西(拖动即可得)
(弹出的信号和槽,这个面板会帮你做connect函数做的事情)
(点击上面的编辑按键,会弹出这个,然后按加号可以新增一些槽函数,然后就可以自动添加到h和cpp,然后就为所欲为)
用Qt做demo:一般步骤和可能用得到的东西_第1张图片

3 逻辑代码就没什么特别要记录的了,要求扎实的个人功底和帅气的脸庞。

4 可能会用到的小东小西:
(1) 弹出消息框,例如警告,例如报喜,例如告诉用户目前在哪个路径。举个栗子:
QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
</pre>其中tr是Qt里面特有的国际化方法。所谓国际化,就是英语用户看英语,中文用户看中文。当然,不是说一个tr就给你(您)自动翻译,而是说会把你(您)写的两种文本绑定起来,然后根据系统判别给出用户看哪种。<br clear="none" />(2)图片显示<br clear="none" />
ui->imageLabel->setPixmap(QPixmap::fromImage(img));
Qt里面可以用label控件来显示图片,而且这种方式貌似比较周到,比用绘图的方法应该目测估计会省性能。如果要使用label显示图片,首先要声明一个QImage,并且赋予某个内容。具体怎么赋予要看API,可以通过图片路径之类的方法。然后用上面那行代码,把img转化成为QPixmap类,然后就可以作为参数传入label了。
特别地,对于使用opencv的用户,福利来了。。。下面这个函数是Qt里面用label显示mat的一个方法。因为数据格式不同(Qt使用RGB,Opencv偏偏是BGR,所以函数里面对此作了一些处理)
void MainWindow::displayMat(Mat image)
{
    Mat rgb;
    QImage img;
    if(image.channels()==3)
    {
        //cvt Mat BGR 2 QImage RGB
        cvtColor(image,rgb,CV_BGR2RGB);
        img =QImage((const unsigned char*)(rgb.data),
                    rgb.cols,rgb.rows,
                    rgb.cols*rgb.channels(),
                    QImage::Format_RGB888);
    }
    else
    {
        img =QImage((const unsigned char*)(image.data),
                    image.cols,image.rows,
                    image.cols*image.channels(),
                    QImage::Format_RGB888);
    }

    ui->imageLabel->setPixmap(QPixmap::fromImage(img));
}

关于这一点,没什么其他要记录的了。万事开头难,开了头就just so so。要实现其他的功能,自己看文档看API看度娘看谷哥。。

(3)选择文件或者选择文件夹路径可以这样做
void MainWindow::on_selectButt_clicked()
{
    QString path = QFileDialog::getExistingDirectory(this, tr("Open"), tr(""));
    if(path.length() == 0)
    {
        QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
        return;
    }

    QMessageBox::information(NULL, tr("Path"), tr("You opened ") + path);
}


QFileDialog里面有其他API,现在这个getExistingDirectory是选择路径的。另外那些是可以直接选择文件,还可以带有过滤器。具体怎么用点开QOpenFileDialog看看就可以了

(4)设置按钮的快捷键
//short cut of next butt
    QShortcut *key_next=new QShortcut(QKeySequence(Qt::Key_D),this);//创建一个快捷键"D"键
    connect(key_next,SIGNAL(activated()),this,SLOT(on_nextButt_clicked()));//连接到指定槽函数

QShortCut提供了快捷键功能。实际上也是信号槽的一种利用。connect就是把Qshortcut所建立的事件和某个槽函数链接起来(用connect),信号一般用activated()。

(5)注意功能模块的分离,便于调试和更改代码。建议和UI有关的放在MainWindow这个类,类里面做好一些公有接口,例如刚刚提到的显示Mat的函数displayMat()。然后和UI无关就新建一个类,例如处理Mat的Processor类,处理数据库的database类,等等等等。说到数据库,我本来是要用的,Qt里面封装了Sqlite的接口。不过后来偷懒就放弃了,研究了一小下,暂时不做记录。


你可能感兴趣的:(C++,qt,开发经验,常用控件)