Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
xEmpire
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
#1

QTableView и компоновщик QGridLayout - C++ Qt

30.03.2014, 15:10. Просмотров 784. Ответов 4
Метки нет (Все метки)

Собственно при добавлении таблицы на форму она выглядит криво. Как это исправить?
Скрин
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "crossoverpage.h"
#include <QErrorMessage>
#include <QtWidgets/QSplitter>
 
CrossoverPage::CrossoverPage(QWidget *parent) :
    QWidget(parent)
{
    m_p1thChromosomeLabel = new QLabel(tr("&First Cromosome"), this);
    m_p2ndCromosomeLabel = new QLabel(tr("&Secondary Chromosome"), this);
    m_paChromosomeEdits[0] = new QLineEdit(this);
    m_paChromosomeEdits[1] = new QLineEdit(this);
 
    m_p1thChromosomeLabel->setBuddy(m_paChromosomeEdits[0]);
    m_p2ndCromosomeLabel->setBuddy(m_paChromosomeEdits[1]);
 
    m_p1thBinaryLabel = new QLabel(this);
    m_p2ndBinaryLabel = new QLabel(this);
 
    m_pNumberCrossPointsLabel = new QLabel(tr("&Number Crossover points"));
    m_pNumberCrossPointsEdit = new QLineEdit(this);
 
    m_pNumberCrossPointsLabel->setBuddy(m_pNumberCrossPointsEdit);
 
    m_pStartButton = new QPushButton(tr("Sta&rt"), this);
 
    m_pGridLayout = new QGridLayout(this);
    m_pGridLayout->addWidget(m_p1thChromosomeLabel, 0, 0, 1, 1);
    m_pGridLayout->addWidget(m_paChromosomeEdits[0], 0, 1, 1, 1);
    m_pGridLayout->addWidget(m_p2ndCromosomeLabel, 1, 0, 1, 1);
    m_pGridLayout->addWidget(m_paChromosomeEdits[1], 1, 1, 1, 1);
    m_pGridLayout->addWidget(m_pNumberCrossPointsLabel, 2, 0, 1, 1);
    m_pGridLayout->addWidget(m_pNumberCrossPointsEdit, 2, 1, 1, 1);
    m_pGridLayout->addWidget(m_pStartButton, 3, 1, 1, 1);
    m_pGridLayout->addWidget(m_p1thBinaryLabel, 4 , 0, 1, 1);
    m_pGridLayout->addWidget(m_p2ndBinaryLabel, 4, 1, 1, 1);
 
 
    QObject::connect(m_pStartButton,SIGNAL(clicked()),SLOT(CreateTable()));
}
 
void CrossoverPage::CreateTable()
{
 
    try {
        if (m_paChromosomeEdits[0]->text().length() != m_paChromosomeEdits[1]
                ->text().length() )
            throw QString(tr("Your chromosomes`re having different length"));
 
        m_pModel = new TableModel(2, m_paChromosomeEdits[0]->text().length(),
                this);
        int *length = new int(m_paChromosomeEdits[0]->text().length());
        for (int i = 0; i < 2; i++) {
            QString Chromosome = m_paChromosomeEdits[i]->text();
            for (int j = 0; j < *length; j++) {
                m_pModel->setData(m_pModel->index(i, j), Chromosome.data()[j],
                                  Qt::DisplayRole);
            }
        }
        delete length;
        m_pTableViev = new QTableView(this);
        m_pTableViev->setModel(m_pModel);
        m_pGridLayout->addWidget(m_pTableViev, 5, 0, m_pModel->rowCount(),
                                 m_pModel->columnCount());
 
    } catch (QString &Error) {
        QErrorMessage EMessage;
        EMessage.showMessage(Error);
        EMessage.exec();
    } catch (...) {}
}
Добавлено через 8 минут
И как можно убрать "лишнее" во время растягивания?
 Комментарий модератора 
Все файлы должны быть размещены на форуме!
0
Миниатюры
QTableView и компоновщик QGridLayout  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 15:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос QTableView и компоновщик QGridLayout (C++ Qt):

QGridLayout
Добрый день. Подскажите, с помощью какого метода можно изменить положения...

QGridLayout перерисовка
Всем привет, хочу узнать такой момент. У меня есть допустим 1000 виджетов,...

Работа с QGridLayout
Добрый день. Хочу разместить чекбоксы табличкой (32 строки, 2 стобца). ...

Работа с QGridLayout
Здравствуйте всем. Имеется QGridLayout с размещенными в нем двумя виджетами. Я...

Работа с QGridLayout
Добры день, коллеги. Подскажите пожалуйста, возможно ли реализовать такой...

QPixmap в QGridLayout
Здравствуйте! Скажите пожалуйста, как разместить картинки в сетке. Пытался так...

4
xEmpire
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
30.03.2014, 22:19  [ТС] #2
Весь проект http://rghost.ru/5-------------0

 Комментарий модератора 
Вам наверно плохо доходит, если с первого раза не понимаете замечаний.


Добавлено через 6 часов 34 минуты
Чистый, прошу прощения

Вообщем во время выполнения программы в экземпляре класса mainwindow меняется CentralWidget в зависимости от выбора пользователя (отправляется сигнал из класса ChoosePage (при создании экземпляра класса MainWindow центральным виджетом является именно ChoosePage) и вызывается сигнал CreateCrossoverPage либо CreateMutationPage). В данный момент MutationPage ещё пустая (поэтому не буду засорять тему исходниками этого класса), т.к ещё не разобрался до конца с кроссинговером

main.cpp:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "mainwindow.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}



mainwindow.h:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
#include "choosepage.h"
#include "crossoverpage.h"
#include "mutationpage.h"
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    ChoosePage *m_pChoosePage;
    CrossoverPage *m_pCrossoverPage;
    MutationPage *m_pMutationPage;
 
public slots:
    void CreateCrossoverPage();
    void CreateMutationPage();
};
 
#endif // MAINWINDOW_H


mainwindow.cpp:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowFlags(Qt::Window | Qt::WindowStaysOnTopHint);
 
    m_pChoosePage = new ChoosePage();
    this->setCentralWidget(m_pChoosePage);
 
    QObject::connect(m_pChoosePage, SIGNAL(SelectedCrossover()),
                     SLOT(CreateCrossoverPage()));
    QObject::connect(m_pChoosePage, SIGNAL(SelectedMutation()),
                     SLOT(CreateMutationPage()));
}
 
void MainWindow::CreateCrossoverPage()
{
    m_pCrossoverPage = new CrossoverPage;
    this->setCentralWidget(m_pCrossoverPage);
    delete m_pChoosePage;
    this->setWindowTitle(tr("Crossover"));
}
 
void MainWindow::CreateMutationPage()
{
    m_pMutationPage = new MutationPage;
    this->setCentralWidget(m_pMutationPage);
    delete m_pChoosePage;
    this->setWindowTitle(tr("Mutation"));
}
 
MainWindow::~MainWindow()
{
}


choosepage.h:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef CHOOSEPAGE_H
#define CHOOSEPAGE_H
 
#include <QWidget>
#include <QtWidgets/QLayout>
 
#include <QtWidgets/QPushButton>
 
class ChoosePage : public QWidget
{
    Q_OBJECT
public:
    explicit ChoosePage(QWidget *parent = 0);
 
private:
    QPushButton *m_pCrossoverButton;
    QPushButton *m_pMutationButton;
 
    QVBoxLayout *m_pVBoxLayout;
 
signals:
    void SelectedCrossover();
    void SelectedMutation();
//public slots:
};
 
#endif // CHOOSEPAGE_H


choosepage.cpp:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "choosepage.h"
 
ChoosePage::ChoosePage(QWidget *parent) :
    QWidget(parent)
{
    m_pCrossoverButton = new QPushButton(tr("Select &Cross over"), this);
    m_pMutationButton = new QPushButton(tr("Select &Mutation"), this);
 
    m_pVBoxLayout = new QVBoxLayout(this);
    m_pVBoxLayout->addWidget(m_pCrossoverButton);
    m_pVBoxLayout->addWidget(m_pMutationButton);
 
    QObject::connect(m_pCrossoverButton, SIGNAL(clicked()),
                     SIGNAL(SelectedCrossover()));
    QObject::connect(m_pMutationButton, SIGNAL(clicked()),
                     SIGNAL(SelectedMutation()));
}


crossoverpage.h:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#ifndef CROSSOVERPAGE_H
#define CROSSOVERPAGE_H
 
#include <QWidget>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLayout>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTableView>
 
#include "tablemodel.h"
 
class CrossoverPage : public QWidget
{
    Q_OBJECT
public:
    explicit CrossoverPage(QWidget *parent = 0);
 
    QGridLayout *m_pGridLayout;
 
    QLabel *m_p1thChromosomeLabel;
    QLabel *m_p2ndCromosomeLabel;
 
    QLineEdit* m_paChromosomeEdits[2];
 
//    QLineEdit *m_p1thChromosomeEdit;
//    QLineEdit *m_p2ndCromosomeEdit;
 
    QLabel *m_p1thBinaryLabel;
    QLabel *m_p2ndBinaryLabel;
 
    QLabel *m_pNumberCrossPointsLabel;
    QLineEdit *m_pNumberCrossPointsEdit;
    
    QPushButton *m_pStartButton;
    
    TableModel *m_pModel;
    QTableView *m_pTableViev;
 
signals:
 
public slots:
    void CreateTable();
 
};
 
#endif // CROSSOVERPAGE_H


crossoverpage.cpp:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "crossoverpage.h"
#include <QErrorMessage>
 
CrossoverPage::CrossoverPage(QWidget *parent) :
    QWidget(parent)
{
    m_p1thChromosomeLabel = new QLabel(tr("&First Cromosome"), this);
    m_p2ndCromosomeLabel = new QLabel(tr("&Secondary Chromosome"), this);
    m_paChromosomeEdits[0] = new QLineEdit(this);
    m_paChromosomeEdits[1] = new QLineEdit(this);
 
    m_p1thChromosomeLabel->setBuddy(m_paChromosomeEdits[0]);
    m_p2ndCromosomeLabel->setBuddy(m_paChromosomeEdits[1]);
 
    m_p1thBinaryLabel = new QLabel(this);
    m_p2ndBinaryLabel = new QLabel(this);
 
    m_pNumberCrossPointsLabel = new QLabel(tr("&Number Crossover points"));
    m_pNumberCrossPointsEdit = new QLineEdit(this);
 
    m_pNumberCrossPointsLabel->setBuddy(m_pNumberCrossPointsEdit);
 
    m_pStartButton = new QPushButton(tr("Sta&rt"), this);
 
    m_pGridLayout = new QGridLayout(this);
    m_pGridLayout->addWidget(m_p1thChromosomeLabel, 0, 0, 1, 1);
    m_pGridLayout->addWidget(m_paChromosomeEdits[0], 0, 1, 1, 1);
    m_pGridLayout->addWidget(m_p2ndCromosomeLabel, 1, 0, 1, 1);
    m_pGridLayout->addWidget(m_paChromosomeEdits[1], 1, 1, 1, 1);
    m_pGridLayout->addWidget(m_pNumberCrossPointsLabel, 2, 0, 1, 1);
    m_pGridLayout->addWidget(m_pNumberCrossPointsEdit, 2, 1, 1, 1);
    m_pGridLayout->addWidget(m_pStartButton, 3, 1, 1, 1);
    m_pGridLayout->addWidget(m_p1thBinaryLabel, 4 , 0, 1, 1);
    m_pGridLayout->addWidget(m_p2ndBinaryLabel, 4, 1, 1, 1);
 
 
    QObject::connect(m_pStartButton,SIGNAL(clicked()),SLOT(CreateTable()));
}
 
void CrossoverPage::CreateTable()
{
 
    try {
        if (m_paChromosomeEdits[0]->text().length() != m_paChromosomeEdits[1]
                ->text().length() )
            throw QString(tr("Your chromosomes`re having different length"));
 
        m_pModel = new TableModel(2, m_paChromosomeEdits[0]->text().length(),
                this);
        int *length = new int(m_paChromosomeEdits[0]->text().length());
        for (int i = 0; i < 2; i++) {
            QString Chromosome = m_paChromosomeEdits[i]->text();
            for (int j = 0; j < *length; j++) {
                m_pModel->setData(m_pModel->index(i, j), Chromosome.data()[j],
                                  Qt::DisplayRole);
            }
        }
        delete length;
        m_pTableViev = new QTableView(this);
        m_pTableViev->setModel(m_pModel);
        m_pGridLayout->addWidget(m_pTableViev, 5, 0, m_pModel->rowCount(),
                                 m_pModel->columnCount());
 
    } catch (QString &Error) {
        QErrorMessage EMessage;
        EMessage.showMessage(Error);
        EMessage.exec();
    } catch (...) {}
}


tablemodel.h:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
 
#include <QVariant>
#include <QString>
#include <QStringList>
#include <QAbstractTableModel>
 
class TableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
//    Конструктор
    /*explicit*/ TableModel(int nRows, int nColumns, QObject *parent = 0);
 
    //    Интерфейсная функция
    QVariant data(const QModelIndex &index, int role) const;
//    Метод для возможности изменения модели (ввод данных с флагом Qt::DisplayRole)
    bool setData(const QModelIndex &index, const QVariant &value, int role);
 
//    Возвращает количество строк
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
//    возвращает количество столбцов
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
//    Возвращает заголовок столбца
//    Возвращаем значение с добавленным флагом Qt::ItemIsEditable
    Qt::ItemFlags flags(const QModelIndex &index) const;
private:
    int                          m_nRows;       // Количество строк
    int                          m_nColumns;    // Количество столбцов
    QHash<QModelIndex, QVariant> m_hash;        // В хеш таблице хранятся все данные
//signals:
 
//public slots:
 
};
 
#endif // TABLEMODEL_H


tablemodel.cpp:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "tablemodel.h"
 
TableModel::TableModel(int nRows, int nColumns, QObject *parent) :
    QAbstractTableModel (parent),
    m_nRows (nRows),
    m_nColumns (nColumns)
{
}
 
QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
//    QString sData;
    return (role == Qt::DisplayRole || role == Qt::EditRole)
            ? m_hash.value (index)
            : QVariant();
}
 
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (index.isValid() && role == Qt::DisplayRole) {
        m_hash[index] = value;
//        Вызов сигнала
        emit dataChanged(index,index);
        return true;
    }
    return false;
}
 
int TableModel::rowCount(const QModelIndex &parent) const
{
    return m_nRows;
}
 
int TableModel::columnCount(const QModelIndex &parent) const
{
    return m_nColumns;
}
 
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    return (index.isValid()) ? (flags | Qt::ItemIsEditable)
                             : flags;
}
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
30.03.2014, 22:28 #3
Форум позволяет вкладывать и архивы, просто в расширенный режим надо перейти
0
xEmpire
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
31.03.2014, 17:50  [ТС] #4
Вообщем благодаря
C++ (Qt)
1
2
m_pTableViev->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_pTableViev->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
Вышло так:
0
Миниатюры
QTableView и компоновщик QGridLayout   QTableView и компоновщик QGridLayout  
xEmpire
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
31.03.2014, 17:52  [ТС] #5
А как выравнивать текст по какому либо краю?
Qt::TextAlignmentRole как нужно менять в моём случае?
0
31.03.2014, 17:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2014, 17:52
Привет! Вот еще темы с решениями:

Настройка QGridLayout
Здравствуйте! Создаю поле из кнопок, но при большем размере окна они...

Пользовательский виджет в QGridLayout
Можно ли свой виджет (состоит из QWidget, QPushButton и еще пару стандартный...

QGridlayout удаление виджета
Здравствуйте всем. Имеется окно MainWindow. На нем располагается QGridLayout. В...

Растягивание объектов QGridLayout
Здравствуйте! Подскажите можно-ли растягивать объекты в QGridLayout? Вот,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru