系统常量对话框QT实现

1.运行结果:

2.代码

main.cpp

 1 #include "constantdiag.h"
 2 #include <QtWidgets/QApplication>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     constantDiag w;
 8     w.show();
 9     return a.exec();
10 }

constantDialog.h

 1 #ifndef CONSTANTDIAG_H
 2 #define CONSTANTDIAG_H
 3 
 4 #include <QtWidgets/QWidget>
 5 #include <QHBoxLayout>
 6 #include <QPushButton>
 7 #include <QStandardItemModel>
 8 #include <QTableView>
 9 #include <QVBoxLayout>
10 #include <QHeaderView>
11 #include <QLabel>
12 
13 class ComboDelegate;
14 
15 class constantDiag : public QWidget
16 {
17     Q_OBJECT
18 
19 public:
20     constantDiag(QWidget *parent = 0);
21     ~constantDiag();
22 
23 public slots:
24     void addConstant();
25     void reduceConstant();
26 
27     
28 private:
29     QHBoxLayout *secondHLayout;
30     QPushButton *btnConstantPlus;
31     QPushButton *btnConstantMinus;
32     QStandardItemModel *model;
33     QTableView *tableview;
34     QVBoxLayout *wholeLayout;
35     QHBoxLayout *thirdHLayout;
36     QPushButton *btnOk;
37     QPushButton *btnCancel;
38     QHBoxLayout *topLayout;
39     QLabel *titleLabel;
40     QVBoxLayout *wholeVLayout;
41     ComboDelegate *comboDelegate;
42 };
43 
44 #endif // CONSTANTDIAG_H
45 
46 
47 #ifndef COMBODELEGATE_H
48 #define COMBODELEGATE_H
49 
50 #include <QItemDelegate>
51 
52 class ComboDelegate : public QItemDelegate
53 {
54     Q_OBJECT
55 public:
56     ComboDelegate(QObject *parent = 0);
57 
58     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex    &index) const;
59     void setEditorData(QWidget *editor, const QModelIndex &index) const;
60     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
61     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const  QModelIndex &index) const;
62 };
63 
64 #endif // COMBODELEGATE_H

constantDialog.cpp

  1 #include "constantdiag.h"
  2 
  3 constantDiag::constantDiag(QWidget *parent)
  4     : QWidget(parent)
  5 {
  6     setWindowTitle(QString::fromLocal8Bit("系统常量"));
  7     resize(480,168);
  8 
  9     wholeLayout = new QVBoxLayout(parent);
 10 
 11     secondHLayout = new QHBoxLayout();
 12     secondHLayout->addStretch();
 13 
 14     btnConstantPlus = new QPushButton;
 15     btnConstantPlus->setText("+");
 16     secondHLayout->addWidget(btnConstantPlus);
 17     
 18     btnConstantMinus = new QPushButton;
 19     btnConstantMinus->setText("-");
 20     secondHLayout->addWidget(btnConstantMinus);
 21 
 22     secondHLayout->setStretch(0,5);
 23     secondHLayout->setStretch(1,1);
 24     secondHLayout->setStretch(2,1);
 25 
 26     wholeLayout->addLayout(secondHLayout);
 27 
 28     model = new QStandardItemModel(2,3);
 29     model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("名称"));
 30     model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit(""));
 31     model->setHeaderData(2,Qt::Horizontal,QString::fromLocal8Bit("单位"));
 32     tableview = new QTableView(parent);
 33     tableview->setModel(model);
 34     tableview->verticalHeader()->setVisible(false);
 35     tableview->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
 36     tableview->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
 37     tableview->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
 38     comboDelegate = new ComboDelegate;
 39     tableview->setItemDelegateForColumn(2,comboDelegate);
 40     //tableview->verticalHeader()->setSectionResizeMode(0,QHeaderView::Stretch);
 41     //tableview->verticalHeader()->setSectionResizeMode(1,QHeaderView::Stretch);
 42 
 43     wholeLayout->addWidget(tableview);
 44 
 45     thirdHLayout = new QHBoxLayout;
 46     thirdHLayout->addStretch();
 47 
 48     btnOk = new QPushButton;
 49     btnOk->setText(QString::fromLocal8Bit("确定"));
 50     btnCancel = new QPushButton;
 51     btnCancel->setText(QString::fromLocal8Bit("取消"));
 52     thirdHLayout->addWidget(btnOk);
 53     thirdHLayout->addWidget(btnCancel);
 54 
 55     thirdHLayout->setStretch(0,5);
 56     thirdHLayout->setStretch(1,1);
 57     thirdHLayout->setStretch(2,1);
 58 
 59     wholeLayout->addLayout(thirdHLayout);
 60     //wholeLayout->setSizeConstraint(QLayout::SetFixedSize);
 61     //wholeLayout->setStretchFactor(secondHLayout, 1);
 62     //wholeLayout->setStretchFactor(tableview, 2);
 63     //wholeLayout->setStretchFactor(thirdHLayout, 1);
 64 
 65     setLayout(wholeLayout);
 66 
 67     connect(btnConstantPlus,SIGNAL(clicked()),this,SLOT(addConstant()));
 68     connect(btnConstantMinus,SIGNAL(clicked()),this,SLOT(reduceConstant()));
 69 }
 70 
 71 constantDiag::~constantDiag()
 72 {
 73 
 74 }
 75 
 76 void constantDiag::addConstant()
 77 {
 78     int row = model->rowCount();
 79     model->insertRow(row);
 80 }
 81 
 82 void constantDiag::reduceConstant()
 83 {
 84     int row = model->rowCount();
 85     model->removeRow(--row);
 86 }
 87 
 88 
 89 #include <QComboBox>
 90 
 91 ComboDelegate::ComboDelegate(QObject *parent) :
 92 QItemDelegate(parent)
 93 {
 94 }
 95 
 96 QWidget *ComboDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &/*option*/,const QModelIndex &/*index*/) const
 97 {
 98     QComboBox *editor = new QComboBox(parent);
 99     //editor->lineEdit()->setAlignment(Qt::AlignCenter);
100     editor->setEditable(true);
101     //editor->setStyleSheet("QComboBox{border:1px solid gray;}""QComboBox QAbstractItemView::item{height:25px;}");
102 
103     //editor->setView(new QListView());
104     editor->addItem("N");
105     editor->addItem("m");
106     editor->addItem("m/s");
107     editor->installEventFilter(const_cast<ComboDelegate*>(this));
108     return editor;
109 }
110 
111 void ComboDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
112 {
113     QString str =index.model()->data(index).toString();
114     QComboBox *box = static_cast<QComboBox*>(editor);
115     int i=box->findText(str);
116     box->setCurrentIndex(i);
117 }
118 
119 void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
120 {
121     QComboBox *box = static_cast<QComboBox*>(editor);
122     QString str = box->currentText();
123     model->setData(index,str);
124 }
125 
126 void ComboDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const
127 {
128     editor->setGeometry(option.rect);
129 }
原文地址:https://www.cnblogs.com/wang-kai/p/6529978.html