Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

QT\QTableWidget несколько вопросов

316
12 июня 2011 года
Alm3n
889 / / 29.05.2009
Доброго времени суток.
Есть необходимость создать табличку QTableWidget, где будет отображаться информация о процессах(id,pid,имя.,etc). Никак не могу вкурить, как правильно ее делать. Сама таблица будет на QTabWidget. Вот вопросы, которые я не разрешил:
1)Где должен создавать экземпляр класса.
2)Как он должен создаваться.
3)Если я создам на QTabWinget рядом с таблицей таймер, по интервалу которого будет вызываться метод класса process, который получит обнавленную информацию о процессах, как сделать, чтобы можно было изменять значения таблицы из методов таймера или метода класса process.
4)Как сделать глобальную переменную для экземпляра класса process, чтобы можно было к ней обращаться из любого модуля?
Читал книги по Qt, да и Qt Demo смотрел, но так как-то все очень жу сложно задуманно, с большим количеством компонентов, чем хотелось бы, какие-то модели и фильтры непонятные.
1
12 июня 2011 года
kot_
7.3K / / 20.01.2000
1) хм. Qt допускает три типа создания интерфейса - закрытое, это когда интерфейс создается как закрытое поле-указатель в классе формы, открытое и еще какоето )). Я обычно использую первый случай. В этом случае создание объекта происходит примерно так:
Код:
\\fmmain.h
namespace Ui {
    class fmMain;
}

class fmMain : public QDialog
{
    Q_OBJECT

public:
    explicit fmMain(QWidget *parent = 0);
    ~fmMain();
    int setDB(QSqlDatabase *db);

protected:
    void changeEvent(QEvent *e);

private:
    Ui::fmMain *ui;
    dmModule dm;
};
\\fmmain.cpp
fmMain::fmMain(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::fmMain)
{
    ui->setupUi(this);//создание и инициализация компонентов интерфейса
}

fmMain::~fmMain()
{
    delete ui;
}

соотвественно доступ к компонентам :
 
Код:
ui->tvList->setEnabled(true);

если надо организовать доступ к компоненту извне класса - то я в таком случае создаю открытые методы доступа либо просто открытый указатель на нужный мне компонент.
Но есть и другие способы. Просто этот я используя сам и требую от своих.
2. Как удобно. Либо в дизигненре либо программно. Проще всего создавать в дизайнере форм - экономит достаточно много времени. Как инициализируется - показал выше.
3. Для QTableWidget данные можно менять непосредственно в записях таблицы - используя методы setItem, например так можно установить значения в таблице используя запрос:
Код:
int dmModule::loadTableDocItem(QWidget *sender, const int &mid, double &summ){
    QTableWidget *tb = (QTableWidget*)sender; //получаем указатель на таблицу
    QStringList li;
    tb->clear();
    tb->setRowCount(0);
    tb->setColumnCount(0);
//формируем список заголовков
    QString heder = "Код";
    li << heder;
    heder = "Наименование";
    li << heder;
    heder = "Smid";
    li << heder;
    heder = "Ед.изм";
    li << heder;
    heder = "Кол-во";
    li << heder;
    heder = "Цена";
    li << heder;
    heder = "Розница";
    li << heder;
    heder  = "Сумма";
    li << heder;
    heder = "did";
    li << heder;

    int count = li.count();
    tb->setColumnCount(count);
//установили заголовки
    tb->setHorizontalHeaderLabels(li);
//скрыли ненужные поля
  tb->setColumnHidden(2,true);
  tb->setColumnHidden(8,true);
    tb->setColumnWidth(0,60);

//сделали запрос
    QSqlQuery query(dmBaseModule::db);
    QString query_str = "select did, gid,smid,gname,smname_short,gcount, gprice, gsumm, price  from loaddocumentitems(?,?)";
    query.prepare(query_str);
    query.addBindValue(mid);
    query.addBindValue(wid);
    query.setForwardOnly(true);
    query.exec();
    summ = 0.0;
//получаем данные
  while(query.next()){
//вставили новую запись
        tb->insertRow(tb->rowCount());
//сделали активной
        tb->setCurrentCell(tb->rowCount()-1,0);
//пошли записывать
        tb->setItem(tb->currentRow(),0,new QTableWidgetItem(query.record().value("gid").toString()));
        tb->setItem(tb->currentRow(),1,new QTableWidgetItem(query.record().value("gname").toString()));
        tb->setItem(tb->currentRow(),2,new QTableWidgetItem(query.record().value("smid").toString()));
        tb->setItem(tb->currentRow(),3,new QTableWidgetItem(query.record().value("smname_short").toString()));
        tb->setItem(tb->currentRow(),4,new QTableWidgetItem(query.record().value("gcount").toString()));

        tb->setItem(tb->currentRow(),5,new QTableWidgetItem(query.record().value("gprice").toString()));

        tb->setItem(tb->currentRow(),6,new QTableWidgetItem(query.record().value("price").toString()));

        summ += query.record().value("gsumm").toDouble();
        QString textF = QString("%1").arg(query.record().value("gsumm").toDouble(),0,'f',2);
        tb->setItem(tb->currentRow(),7,new QTableWidgetItem(textF));
        tb->setItem(tb->currentRow(),8,new QTableWidgetItem(query.record().value("did").toString()));
    }


    return 0;
}

пример вызова функции из формы:
 
Код:
dm.loadTableDocItem(ui->twMain,doc->getDocId(),summ);

4. Объявить класс и включать заголовочный модуль там где необходимо.
316
13 июня 2011 года
Alm3n
889 / / 29.05.2009
Благодарю. Во всем разобрался.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог