关于qt学习的一点小记录(1)

今日为了应付学校作业要求

决定现学qt来制作界面

毕竟c++不像在这方面c#可以那么方便

 

qt主要依靠信号、槽来实现类似winform中的消息

鉴于要尽快做完,故而没有细看qt

只是大概了解了下界面的制作方法

所以依然还有不少问题

 

好了我先从qt设计器开始了。

嗯,很好用的界面编辑器。。一目了然啊~~~

遇到的问题有:

1、槽明明在窗口类声明了,可设计器还是找不到...

解决:这个应该还需要在某些地方增加点代码,毕竟我find了一下别人demo的槽函数名字,发现出现在了好几个地方

嗯。。这次时间关系没有深究,百度了一下,应该在设计器的左上角位置有个编辑信号/槽

然后拖动控件改变发送者接受者等等。

 

 

最后在主类中加入在设机器中添加时槽函数的名字:

 

public slots:
    //添加进程槽
    void rcv_addp();
    //删除进程槽
    void rcv_killp();
    //显示对应进程段页表
    void rcv_show();
    //刷新进程表
    void rcv_flushow();
    //调度进程
    void rcv_play();

 

 

2、与控件有关的设置网上资料略少,查找了不少时间,故而记录一下

主要关于tableview,combobox的

 

tableview:

//tableview可以通过itemview来设置各类参数以及添加删除数据

QStandardItemModel *memmodel;

memmodel = new QStandardItemModel();

//设置列

memmodel->setColumnCount(2);

//设置每列的头名称(注意中文要用QString::fromLocal8Bit()...不要问我为什么...)
memmodel->setHeaderData(0, Qt::Horizontal, QString::fromLocal8Bit("地址"));
memmodel->setHeaderData(1, Qt::Horizontal, QString::fromLocal8Bit("空间"));

//将model设置给ui的tableview
ui.tableView->setModel(memmodel);
//设置表头为固定

ui.tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui.tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);

//设置表头宽度..我是按百分比设置的
ui.tableView->setColumnWidth(0, 0.3 * ui.tableView->geometry().width());
ui.tableView->setColumnWidth(1, 0.58 * ui.tableView->geometry().width());

//设置cell中每列的高度
ui.tableView->verticalHeader()->setDefaultSectionSize(12);
//隐藏行号

ui.tableView->verticalHeader()->setHidden(true);
//设置一次选中一行

ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
//添加一行元素

//从左到右三个参数依次是:第i行cell,第0列,内容。注意内容要是QString类型的

memmodel->setItem(i, 0, new QStandardItem(QString::number(mt.getphyaddr(i))));

 

 

噢...这代码着色好像和直接粘贴没区别。。。

 

//获取选中的数行中第i行第1列的值

    QItemSelectionModel *selections = ui.tableView_state->selectionModel();
    QModelIndexList selected = selections->selectedRows();
    QModelIndex t_data;
    mt.addmaxclock();
    for (auto index : selected) {
        //这里的selected集合即为选中的所有cell的集合,一次取一个cell
        //然而因为我设置的一次选中一行cell,这里我只需要获取第一列即可
        t_data = statemodel->index(index.row(), 0);

        //        QMessageBox::information(this, "aaa", t_data.data().toString());
        int pgnum = t_data.data().toInt();
        if (!it->pg[pgnum]->isRun()) {
            mt.addpagetomem(it->pg[pgnum]);

        }
        else {
            it->pg[pgnum]->clock = mt.getmaxclock();
            mt.addmaxclock();
        }
    }

 

 

接下来是combobox的

 

combobox:

 

//清空combobox

ui.cb_killp->clear();

//添加item(第一个参数为text...第二个不知道什么用,显然不是列表的索引号)

ui.cb_killp->addItem(elem.name.c_str(), elem.pid);

//获取当前combobox选中的值

string name = ui.cb_killp->currentText().toStdString();

//顺便,combobox中currentindexchanged信号的问题

//鉴于我每次增加一个process的时候,都会刷新一次combobox的列表

//这样也会出发currentindexchanged信号,同时他的槽函数也会更改一下combobox的内容

//这样又会发出一个currentindexchanged信号,以至于死循环

//解决方法是刷新combobox的时候关闭信号即可

ui.cb_seep->blockSignals(true);

 

最后记录一下vector的问题

我意图用一个指针来指向vector中的一个数据...

当然是可以的..但当vector容量增加的时候,地址也会发生改变

最后干脆改成数组了..

 

posted @ 2015-06-11 21:19  心若已冷  阅读(251)  评论(0编辑  收藏  举报